LINQPad [Erweiterung] Methoden

143

Hat jemand eine vollständige Liste der LINQPad-Erweiterungsmethoden und -Methoden, wie z

.Dump()

SubmitChanges()
Bent Rasmussen
quelle
1
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da LINQPad ein sich ständig änderndes Tool ist. Eine solide und konkrete und endgültige Antwort auf diese Frage wird eine sehr kurze Lebensdauer haben. Ich schlage vor, es als Off-Topic zu schließen, um zu vermeiden, dass ähnliche Fragen für andere Tools gestellt werden.
Lasse V. Karlsen
5
Nicht, dass ich etwas über die Abstimmung zu sagen hätte, aber ich bin mit Sicherheit nicht einverstanden, diese Antwort zu schließen. Schauen Sie sich zuerst die positiven Stimmen für die Frage an und dann die positiven Stimmen für die ersten beiden Kommentare. Zweitens, wie können die Antworten von Joseph weniger als eine endgültige Antwort sein? er hat das Ding geschrieben. Schließlich verwenden andere Anwendungen Stackoverflow für ihre Dokumentation. Ich verwende LinqPad ständig für die Entwicklung, das Prototyping von C # - und Linq-Abfragen, das Ausführen von SQL, das Ausführen von Quick DBA-Aufgaben und Dutzende anderer Dinge. Zumindest für mich sind Antworten definitiv ein Thema.
EoRaptor013
3
Zum Abschluss: Ich habe mehr als eine Antwort auf ältere Fragen zu C # hinzugefügt, um eine modernere Technik bereitzustellen, die seit Beantwortung der Frage in die Sprache eingeführt wurde. IMO sollten wir erwarten, dass die Wissensdatenbank, die diese Site darstellt, im Laufe der Technologie geändert und aktualisiert wird. Das Themenspektrum, bei dem zukünftige Updates die zu einem bestimmten Zeitpunkt gegebenen Antworten gefährden oder zunichte machen können, ist ziemlich breit: Wenn wir alle Fragen schließen würden, bei denen dies passieren könnte, wäre der Stapelüberlauf eine viel schlechtere Ressource! Hier kann eine vollständige Liste zu einer Teilliste werden, die besser ist als keine Liste!
Bob Sammers

Antworten:

253

LINQPad definiert zwei Erweiterungsmethoden (in LINQPad.Extensions), nämlich Dump()und Disassemble(). Dump()Schreibt mit dem Ausgabeformatierer von LINQPad in das Ausgabefenster und ist überladen, damit Sie eine Überschrift angeben können:

typeof (int).Assembly.Dump ();
typeof (int).Assembly.Dump ("mscorlib");

Sie können auch eine maximale Rekursionstiefe angeben, um die Standardeinstellung von 5 Ebenen zu überschreiben:

typeof (int).Assembly.Dump (1);              // Dump just one level deep
typeof (int).Assembly.Dump (7);              // Dump 7 levels deep
typeof (int).Assembly.Dump ("mscorlib", 7);  // Dump 7 levels deep with heading

Disassemble () zerlegt jede Methode in ILund gibt die Ausgabe in einer Zeichenfolge zurück:

typeof (Uri).GetMethod ("GetHashCode").Disassemble().Dump();

Zusätzlich zu diesen beiden Erweiterungsmethoden gibt es in LINQPad.Util einige nützliche statische Methoden. Diese werden in Autocompletion dokumentiert und umfassen:

  • Cmd - führt einen Shell-Befehl oder ein externes Programm aus
  • CreateXhtmlWriter - Erstellt einen Textschreiber, der den Dump () - Formatierer von LINQPad verwendet
  • SqlOutputWriter - Gibt den Textschreiber zurück, der in das SQL-Ausgabefenster schreibt
  • GetMyQueries , GetSamples - Gibt eine Sammlung von Objekten zurück, die Ihre gespeicherten Abfragen / Beispiele darstellen (führen Sie beispielsweise eine Suche mit Bearbeiten | Alle durchsuchen aus).
  • Hervorheben - Umschließt ein Objekt so, dass es beim Ablegen gelb hervorgehoben wird
  • HorizontalRun - Mit dieser Option können Sie eine Reihe von Objekten in derselben Zeile ablegen

LINQPad bietet auch die HyperLinq-Klasse. Dies hat zwei Zwecke: Der erste besteht darin, normale Hyperlinks anzuzeigen:

new Hyperlinq ("www.linqpad.net").Dump();
new Hyperlinq ("www.linqpad.net", "Web site").Dump();
new Hyperlinq ("mailto:[email protected]", "Email").Dump();

Sie können dies kombinieren mit Util.HorizontalRun:

Util.HorizontalRun (true,
  "Check out",
   new Hyperlinq ("http://stackoverflow.com", "this site"),
  "for answers to programming questions.").Dump();

Ergebnis:

Auf dieser Website finden Sie Antworten auf Programmierfragen.

Der zweite Zweck von HyperLinq besteht darin, Abfragen dynamisch zu erstellen:

// Dynamically build simple expression:
new Hyperlinq (QueryLanguage.Expression, "123 * 234").Dump();

// Dynamically build query:
new Hyperlinq (QueryLanguage.Expression, @"from c in Customers
where c.Name.Length > 3
select c.Name", "Click to run!").Dump();

Sie können auch Ihre eigenen Erweiterungsmethoden in LINQPad schreiben. Gehen Sie zu "Meine Abfragen" und klicken Sie auf die Abfrage "Meine Erweiterungen". Alle hier definierten Typen / Methoden sind für alle Abfragen zugänglich:

void Main()
{
  "hello".Pascal().Dump();  
}

public static class MyExtensions
{
  public static string Pascal (this string s)
  {
    return char.ToLower (s[0]) + s.Substring(1);
  }
}

In 4.46 (.02) wurden neue Klassen und Methoden eingeführt :

  • DumpContainer (Klasse)
  • OnDemand (Erweiterungsmethode)
  • Util.ProgressBar (Klasse)

Darüber hinaus unterstützt die Hyperlinq-Klasse jetzt einen Aktionsdelegierten , der aufgerufen wird, wenn Sie auf den Link klicken, sodass Sie im Code darauf reagieren und nicht nur auf externe Webseiten verlinken können.

DumpContainer ist eine Klasse, die dem Ausgabefenster einen Block hinzufügt, dessen Inhalt ersetzt werden kann.

HINWEIS! Denken Sie daran, .Dump()die DumpContainersich in der entsprechenden Stelle.

Benutzen:

var dc = new DumpContainer();
dc.Content = "Test";
// further down in the code
dc.Content = "Another test";

OnDemandist eine Erweiterungsmethode, die den Inhalt ihres Parameters nicht in das Ausgabefenster ausgibt, sondern stattdessen einen anklickbaren Link hinzufügt, der beim Klicken den Link durch den .Dump()ed-Inhalt des Parameters ersetzt. Dies ist ideal für manchmal benötigte Datenstrukturen, die teuer sind oder viel Platz beanspruchen.

HINWEIS! Denken Sie an .Dump()die Ergebnisse des Anrufs OnDemandan der entsprechenden Stelle.

Um es zu benutzen:

Customers.OnDemand("Customers").Dump(); // description is optional

Util.ProgressBar ist eine Klasse, die einen grafischen Fortschrittsbalken im Ausgabefenster anzeigen kann, der im Verlauf des Codes geändert werden kann.

HINWEIS! Denken Sie an .Dump()das Util.ProgressBar-Objekt an der entsprechenden Stelle.

Um es zu benutzen:

var pb = new Util.ProgressBar("Analyzing data");
pb.Dump();
for (int index = 0; index <= 100; index++)
{
    pb.Percent = index;
    Thread.Sleep(100);
}
Joe Albahari
quelle
33
Nichts ist besser als eine Antwort des Autors selbst!
John
1
Joe, ich wollte eigentlich auch einige Grafiken als Prototyp erstellen und dann eine Bitmap ausgeben. Es wäre großartig mit einer Show-Methode für diese Art von Arbeit, bei der Sie eine Visualisierung wünschen, an Grafiken, Bildern usw. arbeiten möchten. Möglicherweise bieten Sie ordentliche Visualisierungen für einige andere Typen in der Zukunft.
Bent Rasmussen
... Solange Sie Grafiken an das Ausgabefenster senden können, können wir für den Rest selbst Erweiterungen erstellen.
Bent Rasmussen
3
Mit der Beta-Version 4.26 können Sie XHTML in den Ausgabestream einfügen, indem Sie Util.RawHtml aufrufen. Gehen Sie zu www.linqpad.net/beta.aspx (oder warten Sie einige Tage auf RTM).
Joe Albahari
1
Alex - um> 1 Ding auf eine Linie zu bringen, benutze Util.HorizontalRun
Joe Albahari
131

Neben dem bekannten myQuery.Dump("Query result:")Merkmal ist auch die UtilKlasse zu erwähnen : Sie enthält viele recht praktische Methoden (einige davon habe ich erwähnt, aber es gibt noch viel mehr).

Interessant ist auch , dass man die Art und Weise ändern Dump()Werke .

Abschließend zeige ich Ihnen, wie Sie Änderungen dauerhaft vornehmen (dh LINQ-Abfragen einfügen, aktualisieren, löschen ) können, indem Sie SubmitChanges()oder SaveChanges()auf das interne Verbindungsobjekt von LinqPad zugreifen.

Abschließend zeige ich Ihnen, wie Sie in LinqPad einfache 2D-Grafiken erstellen können (Zeichnen von Linien, Bitmaps oder Funktionen ).

Hier ist eine Sammlung integrierter LinqPad-Funktionen (aus eigener Erfahrung mit dem Tool):


.Dump ()

(Parameter verfügbar in LinqPad v5.03.08 und höher)

Alle LinqPad-Benutzer kennen und lieben die .Dump()Erweiterungsmethode, die (fast) alles verbraucht und druckt.

Aber wussten Sie, dass einige Parameter verfügbar sind? Schauen Sie sich dieses Code-Snippet an:

var obj=new { a="Hello", b=5, c="World", d=new { y=5, z=10 } };
obj.Dump(description: "1st example", depth: 5, toDataGrid: false, exclude: "b,d");
obj.Dump("2nd example", exclude: "a,c");
obj.Dump("2nd example", exclude: "+b,d"); // new in V5.06.06 beta

Das erste Beispiel druckt nur Variablen aund cund verbirgt sich bund ddas zweite Beispiel macht das Gegenteil (beachten Sie, dass nur 2 der verfügbaren Parameter angegeben werden). Die Variablen yund zkönnen nicht einzeln ausgeblendet werden, weil sie nicht auf der obersten Ebene sind.

Folgende Parameter stehen zur Verfügung ( alle sind optional ):

  • description [string] - Enthält eine Beschreibung für das zu sichernde Objekt
  • depth [int?] - begrenzt, wie tief die Objekte rekursiv untersucht werden
  • toDataGrid [bool] - Wenn true, wird die Ausgabe als Datagrid und nicht als RichText formatiert
  • exclude[string] - Wenn Sie eine durch Kommas getrennte Liste von Variablen angeben, werden diese von der Ausgabe ausgeschlossen (im Beispiel "a, c": bund dwerden angezeigt aund causgeblendet).
  • exclude[string] mit dem Präfix "+" - Das Präfix invertiert die Logik des Ausschlussparameters. Dies bedeutet, wenn Sie eine durch Kommas getrennte Liste von Variablen bereitstellen, werden alle außer den angegebenen ausgeblendet (im Beispiel "+ b, d": bund dwerden angezeigt, alle anderen ausgeblendet).
  • Speichern Sie eingeschlossene und ausgeschlossene Eigenschaften in einer Variablen (neu seit LinqPad V5.09.04):
    var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
    Die erste Zeichenfolge enthält eine Liste der einzuschließenden Eigenschaften, die zweite Zeichenfolge eine Liste, die ausgeschlossen werden soll
  • Beim Klicken erweitern: Wenn Sie .OnDemand("click me").Dump();anstelle von verwenden .Dump(), wird ein Link angezeigt, auf den Sie zum Erweitern klicken können. Nützlich, wenn Sie Werte überprüfen möchten, z. B. Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();um immer die ID standardmäßig anzuzeigen, die Details jedoch customerObjectnur dann anzuzeigen, wenn Sie daran interessiert sind.

Weiterführende Themen zu Dump finden Sie hier und da .


Umgebung

Dies ist keine LinqPad-Erweiterung, sondern eine .NET-Klasse, aber da sie nützlich ist, werde ich sie trotzdem erwähnen. Sie können viele nützliche Informationen erhalten, die Sie in Ihren Skripten verwenden können, wie zum Beispiel:

Environment.UserDomainName.Dump();
Environment.MachineName.Dump();
Environment.UserName.Dump();
Environment.CurrentDirectory.Dump();
Environment.SystemDirectory.Dump();

NB Für den Erhalt Domain\UserNamewürde ich System.Security.Principal.WindowsIdentity.GetCurrent().Name
eher verwenden als Environment.UserDomainName+@"\"+Environment.UserName.


Util.WriteCsv

( neu: verfügbar seit LinqPad Version v4.45.05 (Beta) )

Util.WriteCsv (Customers, @"c:\temp\customers.csv");

Dadurch wird der Inhalt der Tabelle Customersin die CSV-Datei geschrieben c:\temp\customers.csv. Sie können auch ein schönes Beispiel finden , wie zu benutzen Util.WriteCsvund dann die CSV - Daten zeigen in LINQPad das Ergebnisfenster hier .

Hinweise:

  • Um eine CSV-Datei abzurufen / zu erstellen, die sich im selben Verzeichnis wie die Abfrage befindet, können Sie Folgendes verwenden:
    var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");

  • Wenn die Tabelle groß ist, verwenden ObjectTrackingEnabled = false;Sie sie, bevor Sie die CSV schreiben, um ein Zwischenspeichern im Speicher zu vermeiden.

  • Wenn Sie eine Tabelle im XML-Format anstatt als durch Kommas getrennte Datei ausgeben möchten , können Sie dies wie folgt tun:

    var xmlFile=Util.CurrentQueryPath.Replace(".linq", ".xml");
    var xml = XElement.Load(xmlFile);
    var query =
      from e in xml.Elements()
      where e.Attribute("attr1").Value == "a"
      select e;
    query.Dump();

    In diesem Beispiel werden alle Elemente mit dem Attribut zurückgegeben, attr1das den Wert "a"aus einer XML-Datei enthält, die denselben Namen wie die Abfrage hat und im selben Pfad enthalten ist. Weitere Codebeispiele finden Sie unter diesem Link.


Util.GetPassword

var pwd = Util.GetPassword("UserXY");

Dadurch wird das Kennwort aus dem in LinqPad integrierten Kennwortmanager abgerufen. So erstellen und das Passwort zu ändern, öffnen Sie den „Password Manager“ Menüpunkt im Menü „Datei“ von LinqPad. Wenn beim Ausführen des C # -Codes kein Kennwort gespeichert wird, wird ein Kennwortdialog geöffnet, in dem Sie nach dem Kennwort gefragt werden. Sie haben die Möglichkeit, es im laufenden Betrieb zu erstellen und zu speichern, indem Sie das Kontrollkästchen Kennwort speichern aktivieren (im Beispiel das Kennwort) für "UserXY" würde gespeichert, und später finden Sie diesen Eintrag im Passwort-Manager ).

Vorteile sind, dass Sie das Kennwort in den von Ihnen erstellten LinqScripts sicher, separat und verschlüsselt im Windows-Benutzerprofil speichern können (es wird %localappdata%\LINQPad\Passwordsals Datei gespeichert). LinqPad verwendet Windows DPAPI, um das Kennwort zu schützen.

Außerdem wird das Kennwort zentral gespeichert. Wenn Sie es ändern müssen, können Sie dies im Menü tun. Es gilt sofort für alle von Ihnen erstellten Skripts.

Anmerkungen:

  • Wenn Sie das Kennwort nicht speichern und nur ein Kennwortdialogfeld
    var pwd = Util.GetPassword("UserXY", true);
    aufrufen möchten , können Sie den zweiten Parameter wie folgt verwenden: Dadurch wird das Kontrollkästchen Kennwort speichern im Kennwortdialogfeld deaktiviert (der Benutzer kann es jedoch weiterhin aktivieren und wählen Sie trotzdem zu speichern).

  • Wenn Sie möchten, dass das Passwort in a gespeichert wird, können Sie diese Hilfsfunktion verwenden SecureString(nb: Um die Erweiterungsmethode zu .ToSecureString()verwenden, folgen Sie bitte diesem Link bei Stackoverflow - Sie können es bei Bedarf auch zurückkonvertieren):
    System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
    {
      return Util.GetPassword(Name, noDefaultSave).ToSecureString();
    }


Util.Cmd

Diese Methode funktioniert wie ein Befehlsprozessor. Sie können alle Ihnen bekannten Befehle über die Windows-Konsole aufrufen.

Beispiel 1 - dir:

Util.Cmd(@"dir C:\");

Dadurch wird das Ergebnis des Verzeichnisses ausgegeben, ohne dass dies erforderlich .Dumpist. Das Speichern in einer Variablen hat den Vorteil, dass Sie weitere Linq-Abfragen verwenden können. Beispielsweise:

var path=@"C:\windows\system32"; 
var dirSwitch="/s/b";
var x=Util.Cmd(String.Format(@"dir ""{0}"" {1}", path, dirSwitch), true);
var q=from d in x 
        where d.Contains(".exe") || d.Contains(".dll")              
        orderby d
    select d;
q.Dump();

Dadurch werden alle Dateien mit den darin enthaltenen Dateierweiterungen ".exe" oder ".dll" ausgegeben C:\windows\system32. Der /sSchalter wird verwendet, um alle Unterverzeichnisse zu rekursieren, und /bwird für das reine Ausgabeformat verwendet. Beachten Sie, dass der zweite Parameter der Cmd-Methode angegeben wird, um die Konsolenausgabe zu unterdrücken und nur das gefilterte Ergebnis mit der Dump-Methode anzuzeigen.

Sie können sehen, dass dies flexibler ist als die Platzhalter, mit denen Sie arbeiten, dirda Sie die volle Flexibilität der Linq-Abfrage-Engine nutzen können.

Beispiel 2 - Texteditor:

Sie können eine Datei im Editor wie folgt öffnen:

var filePath=@"C:\HelloWorld.txt";
Util.Cmd(@"%systemroot%\system32\notepad.exe", filePath);

Util.Image

Zeigt Bilder von einer URL an. Beispiel:

var url = "http://chart.apis.google.com/chart?cht=p3&chd=s:Uf9a&chs=350x140&chl=January|February|March|April";
Util.Image(url).Dump();

Util.ProgressBar, Util.Progress

Mit Util.ProgressBarkönnen Sie einen Fortschrittsbalken anzeigen. Sie können die folgende Hilfsklasse verwenden:

public class ProgressBar
{
    Util.ProgressBar prog;

    public ProgressBar() 
    { 
        Init("Processing"); 
    }

    private void Init(string msg)
    {
        prog = new Util.ProgressBar (msg).Dump();
        prog.Percent=0;
    }

    public void Update(int percent)
    {
        Update(percent, null);
    }   

    public void Update(int percent, string msg)
    {
        prog.Percent=percent;
        if (String.IsNullOrEmpty(msg))
        {
            if (percent>99) prog.Caption="Done.";
        }
        else
        {
            prog.Caption=msg;
        }
    }
}

Verwenden Sie es einfach wie im folgenden Beispiel gezeigt:

void Main()
{
    var pb1= new ProgressBar();
    Thread.Sleep(50);
    pb1.Update(50, "Doing something"); Thread.Sleep(550);
    pb1.Update(100); Thread.Sleep(50);
}

Alternativ können Util.ProgressSie die integrierte Fortschrittsanzeige von LinqPads aktualisieren, zum Beispiel:

Util.Progress = 25; // 25 percent complete

Der Unterschied besteht darin, dass es nicht im Ergebnisfenster angezeigt wird und Sie ihm keine Nachricht zuweisen können.


Util.RawHtml

Zeigt HTML im Ausgabefenster an. Beispiel:

Util.RawHtml (new XElement ("h1", "This is a big heading")).Dump();

Hyperlinq, Util.HorizontalRun

Sie können diese Beispielfunktion verwenden

public void ShowUrl(string strURL, string Title)
{
    Action showURL = delegate() { Process.Start("iexplore.exe", strURL); };
    var url = new Hyperlinq(showURL, "this link", true);
    Util.HorizontalRun (true, "Click ", url, " for details.").Dump(Title);
}

um Hyperlinks im Ergebnisfenster anzuzeigen - oder Aktionen wie das Öffnen Ihres Lieblingseditors. Verwendung:

ShowUrl("http://stackoverflow.com", "Check out StackOverflow");

Beachten Sie, dass diese Funktion immer funktioniert, während new Hyperlinq ("http://myURL", "Web site").Dump();sie für bestimmte URLs nicht funktioniert (insbesondere, wenn Sie Portnamen wie ": 1234" als Teil der URL übergeben müssen).


Util.ReadLine

Liest Eingaben von der Konsole. Beispiel:

int age = Util.ReadLine<int> ("Enter your age");

Als Synonym für Util.ReadLine<string>()können Sie auch verwenden Console.ReadLine().

Aber es gibt noch mehr! Sie können einen einfachen JSON-Parser mit dem folgenden Snippet erstellen - sehr nützlich, wenn Sie beispielsweise eine JSON-Zeichenfolge im laufenden Betrieb analysieren und testen möchten. Speichern Sie das folgende Snippet mit einem Texteditor als JSONAnalyzer.linq und öffnen Sie es dann in LinqPad (um die Referenzen einfach im Handumdrehen hinzuzufügen):

<Query Kind="Program">
    <Reference>&lt;RuntimeDirectory&gt;\System.Web.Extensions.dll</Reference>
    <Namespace>System.Web.Script.Serialization</Namespace>
</Query>

void Main()
{
    var jsonData=Util.ReadLine<string>("Enter JSON string:");
    var jsonAsObject = new JavaScriptSerializer().Deserialize<object>(jsonData);
    jsonAsObject.Dump("Deserialized JSON");
}

Jetzt können Sie es ausführen und einfach eine JSON-Zeichenfolge aus der Zwischenablage in die Konsole einfügen. Mit dieser DumpFunktion wird sie als Objekt angezeigt. Außerdem werden die Fehlermeldungen des Parsers auf dem Bildschirm angezeigt, um Probleme zu beheben. Sehr nützlich zum Debuggen von AJAX.

JSON


Util.ClearResults

Wenn Sie das Ergebnisfenster in Ihrem Skript löschen müssen, verwenden Sie:

Util.ClearResults();

Verwenden Sie es entweder oben in Ihrem Skript oder - wenn Sie mehrere Abfragen in einem Skript ausführen - sollten Sie auf Benutzereingaben warten, bevor Sie den Bildschirm ausblenden (z. B. indem Sie ihm vorangestellt werden Util.ReadLine).


Custom .Dump () - ICustomMemberProvider

Interessant ist auch, dass Sie die Ausgabe der .Dump()Methode ändern können . Implementieren Sie einfach die Schnittstelle ICustomMemberProvider, z

public class test : ICustomMemberProvider 
{

      IEnumerable<string> ICustomMemberProvider.GetNames() {
        return new List<string>{"Hint", "constMember1", "constMember2", "myprop"};
      }

      IEnumerable<Type> ICustomMemberProvider.GetTypes() 
      {
        return new List<Type>{typeof(string), typeof(string[]), 
            typeof(string), typeof(string)};
      }

      IEnumerable<object> ICustomMemberProvider.GetValues() 
      {
        return new List<object>{
        "This class contains custom properties for .Dump()", 
        new string[]{"A", "B", "C"}, "blabla", abc};
      }

      public string abc = "Hello1"; // abc is shown as "myprop"
      public string xyz = "Hello2"; // xyz is entirely hidden
}

Wenn Sie eine Instanz dieser Klasse erstellen, wie z

var obj1 = new test();
obj1.Dump("Test");

dann wird es nur ausgegeben Hint, constMember1, constMember2, und myprop, aber nicht Eigentum xyz:

Linqpad Dump


Anzeigen einer MessageBox oder InputBox in LinqPad

Wenn Sie ein Meldungsfeld anzeigen müssen, lesen Sie hier, wie es geht.

Beispielsweise können Sie eine InputBox mithilfe des folgenden Codes anzeigen

void Main()
{
    string inputValue="John Doe"; 
    inputValue=Interaction.InputBox("Enter user name", "Query", inputValue);
    if (!string.IsNullOrEmpty(inputValue)) // not cancelled and value entered
    {
        inputValue.Dump("You have entered;"); // either display it in results window
        Interaction.MsgBox(inputValue, MsgBoxStyle.OkOnly, "Result"); // or as MsgBox
    }
}

(Vergessen Sie nicht, F4 zu drücken und Microsoft.VisualBasic.dll und seine Namespaces hinzuzufügen, damit dies funktioniert.)


Util.Run

( neu: verfügbar seit LinqPad Version v4.52.1 (Beta) )

Ermöglicht das Ausführen eines anderen LINQPad-Skripts in Ihrem Skript oder in Ihrem eigenen .NET-Programm oder Windows-Dienst (unter Bezugnahme auf die LINQPad4-AnyCPU-Version von LINQPad.exe). Das Skript wird genau so ausgeführt, wie es das Befehlszeilentool lprun.exetun würde.

Beispiele:

const string path=@"C:\myScripts\LinqPad\";
var dummy=new LINQPad.QueryResultFormat(); // needed to call Util.Run
Util.Run(path+"foo.linq", dummy);

In diesem Beispiel wird das Skript ausgeführt foo.linq, das den folgenden Beispielcode enthält:

void Main(string[] args)
{
    #if CMD
       "I'm been called from lprun! (command line)".Dump();
    #else
       "I'm running in the LINQPad GUI!".Dump();
       args = new[] { "testhost", "[email protected]", "[email protected]", "Test Subject" };
    #endif
    args.Dump("Args");
}

Hier können Sie überprüfen, ob das Skript in der LinqPad-Benutzeroberfläche oder über lprun.exeoder mit ausgeführt wurde Util.Run.

Hinweis: Die folgenden Aufrufvarianten können hilfreich sein:

Util.Run(path+"foo.linq", dummy).Dump(); // obviously dumps the script output!
Util.Run(path+"foo.linq", dummy).Save(path+"foo.log"); // writes output into log
Util.Run(path+"foo.linq", dummy).SaveAsync(path+"foo1.log");     // async output log

SubmitChanges () - Linq To SQL

Wenn Sie LinqToSQL verwenden , möchten Sie möglicherweise Änderungen dauerhaft vornehmen (für Einfüge- / Aktualisierungs- / Löschvorgänge ). Da der Datenbankkontext implizit von LinqPad erstellt wird, müssen Sie SubmitChanges()nach jeder Änderung wie unten gezeigt aufrufen .

Beispiele für die (LinqPad-) Northwind- Datenbank:

Einfügen

var newP = new Products() { ProductID=pID, CategoryID=cID, 
            ProductName="Salmon#"+pID.ToString() };
Products.InsertOnSubmit(newP);
SubmitChanges();    

Aktualisieren

var prod=(from p in Products
            where p.ProductName.Contains("Salmon")
            select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
SubmitChanges(); 

Löschen

var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") ||
    p.ProductName.Contains("Trout"));
foreach(var item in itemsToDelete) { Products.DeleteOnSubmit(item); }
SubmitChanges();

Hinweis: Um gültige IDs für die vorherigen Beispiele zu erhalten, können Sie Folgendes verwenden:

var cID = (from c in Categories 
            where c.CategoryName.Contains("Seafood") 
            select c).FirstOrDefault().CategoryID;

var pID = Products.Count()+1;

bevor Sie sie aufrufen.


SaveChanges () - Entity Framework

Wenn Sie Entity Framework verwenden , möchten Sie möglicherweise auch Änderungen dauerhaft vornehmen (für Einfüge- / Aktualisierungs- / Löschvorgänge ). Da der Datenbankkontext implizit von LinqPad erstellt wird, müssen Sie SaveChanges()nach jeder Änderung wie unten gezeigt aufrufen .

Die Beispiele sind im Grunde die gleichen wie zuvor für LinqToSQL , aber Sie müssen SaveChanges()stattdessen verwenden, und zum Einfügen und Löschen haben sich auch die Methoden geändert.

Einfügen

var newP = new Products() { ProductID=pID, CategoryID=cID, 
            ProductName="Salmon#"+pID.ToString() };
Products.Add(newP);
SaveChanges();  

Aktualisieren

var prod=(from p in Products
            where p.ProductName.Contains("Salmon")
            select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
SaveChanges(); 

Löschen

var itemsToDelete=Products.Where(p=> p.ProductName.Contains("Salmon") ||
    p.ProductName.Contains("Trout"));
foreach(var item in itemsToDelete) { Products.Remove(item); }
SaveChanges();

Hinweis: Um gültige IDs für die vorherigen Beispiele zu erhalten, können Sie Folgendes verwenden:

var cID = (from c in Categories 
            where c.CategoryName.Contains("Seafood") 
            select c).FirstOrDefault().CategoryID;

var pID = Products.Count()+1;

bevor Sie sie aufrufen.


this - Datenbankkontext

In LinqPad wird der Datenbankkontext automatisch angewendet, indem Sie das Kombinationsfeld oben verwenden und die richtige Datenbank für Ihre Abfrage auswählen . Manchmal ist es jedoch hilfreich, explizit darauf zu verweisen, z. B. wenn Sie Code aus Ihrem Projekt aus Visual Studio kopieren und in LinqPad einfügen.

Ihr Codefragment aus dem Visual Studio-Projekt sieht sehr wahrscheinlich folgendermaßen aus:

var prod=(from p in dc.Products
            where p.ProductName.Contains("Salmon")
            select p).FirstOrDefault();
prod.ProductName="Trout#"+prod.ProductID.ToString();
dc.SaveChanges(); 

Was soll ich jetzt machen dc? Natürlich können Sie jedes Vorkommen dc.in Ihrer Abfrage entfernen , aber es ist viel einfacher. Einfach hinzufügen

var dc=this; // UserQuery

an die Spitze Ihres Snippets wie folgt:

void Main()
{
    var dc=this;
    var prod=(from p in dc.Products
                where p.ProductName.Contains("Salmon")
                select p).FirstOrDefault();
    prod.ProductName="Trout#"+prod.ProductID.ToString();
    dc.SaveChanges(); 
}   

und der Code wird sofort funktionieren!


this.Connection

Verwenden von LinqPad mit OleDb, Konvertieren einer Datentabelle in ein Linq-Objekt, SQL-Abfragen in Linq

Das folgende Codefragment hilft Ihnen bei der Verwendung von LinqPad mit OleDb. Fügen Sie System.Data.OleDbaus der System.DataAssembly die Abfrageeigenschaften hinzu und fügen Sie den folgenden Code ein Main():

var connStr="Provider=SQLOLEDB.1;"+this.Connection.ConnectionString; 

OleDbConnection conn = new OleDbConnection(connStr);
DataSet myDS = new DataSet();
conn.Open();

string sql = @"SELECT * from Customers";
OleDbDataAdapter adpt = new OleDbDataAdapter();
adpt.SelectCommand = new OleDbCommand(sql, conn); 
adpt.Fill(myDS);

myDS.Dump();

Fügen Sie nun eine SqlServer-Verbindung zu LinqPad hinzu und fügen Sie die Northwind-Datenbank hinzu, um dieses Beispiel auszuführen.

NB: Wenn Sie nur die Datenbank und den Server der aktuell ausgewählten Verbindung abrufen möchten, können Sie dieses Codefragment verwenden:

void Main()
{
    var dc=this;
    var tgtSrv=dc.Connection.DataSource;
    var tgtDb=dc.Connection.ConnectionString.Split(';').Select(s=>s.Trim())
        .Where(x=>x.StartsWith("initial catalog", StringComparison.InvariantCultureIgnoreCase))
        .ToArray()[0].Split('=')[1];
    tgtSrv.Dump();
    tgtDb.Dump();
}

Sie können sogar myDSin Linq konvertieren . Die Antworten auf die folgende Frage zeigen, wie es geht: Schöne Beispiele für die Verwendung des dynamischen Schlüsselworts .NET 4 mit Linq

Ein weiteres Beispiel: Angenommen, Ihr DBA gibt Ihnen eine SQL-Abfrage und Sie möchten die Ergebnisse in LinqPad analysieren - natürlich in Linq, nicht in SQL. Dann können Sie Folgendes tun:

void Main()
{
    var dc=this;

    // do the SQL query
    var cmd =
        "SELECT Orders.OrderID, Orders.CustomerID, Customers.CompanyName,"
        +"       Customers.Address, Customers.City"
        +" FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID";
    var results = dc.ExecuteQuery<OrderResult>(cmd);

    // just get the cities back, ordered ascending
    results.Select(x=>x.City).Distinct().OrderBy(x=>x).Dump();
}

class OrderResult
{   // put here all the fields you're returning from the SELECT
    public dynamic OrderID=null; 
    public dynamic CustomerID=null;
    public dynamic CompanyName=null;
    public dynamic Address=null;
    public dynamic City=null;
}

In diesem Beispiel wird die SELECT-Abfrage des Datenbankadministrators nur in den Befehlstext "geworfen", und die Ergebnisse werden nach Stadt gefiltert und sortiert.
Dies ist natürlich ein vereinfachtes Beispiel. Ihr DBA würde Ihnen wahrscheinlich ein komplexeres Skript geben, aber Sie haben die Idee: Fügen Sie einfach eine unterstützende Ergebnisklasse hinzu, die alle Felder aus der SELECT-Klausel enthält, und verwenden Sie sie dann direkt .
Auf diese Weise können Sie sogar das Ergebnis einer gespeicherten Prozedur in Linq verwenden. Wie Sie sehen können, ist mir in diesem Beispiel der Datentyp und seine Verwendung dynamiczum Ausdrücken egal .
Es geht also wirklich um schnelle Programmierung, um Daten schnell analysieren zu können. Sie sollten dies aus verschiedenen Gründen in Ihrer realen Anwendung nicht tun (SQL-Injection, da Sie EF von Anfang an verwenden können usw.).


PanelManager

Zeichnen Sie eine Grafik in LinqPad, Teil 1

So verwenden Sie die untenstehenden Beispiele, drücken Sie F4und fügen Sie System.Windows.dll, System.Windows.Forms.dll, WindowsFormsIntegration.dll, PresentationCore.dllund PresentationFramework.dllzu Ihrem LinqPad Programm und auch den Namespace hinzufügen System.Windows.Shapes.

Das erste Beispiel zeichnet einfach eine Linie:

var myLine = new Line();
myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
myLine.X1 = 1; myLine.X2 = 50;
myLine.Y1 = 1; myLine.Y2 = 50;
myLine.StrokeThickness = 2;
PanelManager.DisplayWpfElement(myLine, "Graphic");

Das zweite Beispiel zeigt, wie Sie mithilfe des PanelManager Grafiken in LinqPad anzeigen können. Normalerweise unterstützt LinqPad nur Wpf-Objekte. In diesem Beispiel wird System.Windows.Forms.Integration.WindowsFormsHostein machen , zur Windows.Forms.PictureBoxVerfügung (es wurde inspiriert durch diese ):

// needs (F4): System.Windows.dll, System.Windows.Forms.dll, 
// WindowsFormsIntegration.dll, PresentationCore.dll, PresentationFramework.dll 
void Main()
{       
    var wfHost1 = new System.Windows.Forms.Integration.WindowsFormsHost();
    wfHost1.Height=175; wfHost1.Width=175; wfHost1.Name="Picturebox1";
    wfHost1.HorizontalAlignment=System.Windows.HorizontalAlignment.Left;
    wfHost1.VerticalAlignment=System.Windows.VerticalAlignment.Top;
    System.Windows.Forms.PictureBox pBox1 = new System.Windows.Forms.PictureBox();
    wfHost1.Child = pBox1;
    pBox1.Paint += new System.Windows.Forms.PaintEventHandler(picturebox1_Paint);
    PanelManager.StackWpfElement(wfHost1, "Picture");
} 

public string pathImg
{
    get { return System.IO.Path.Combine(@"C:\Users\Public\Pictures\Sample Pictures\", 
            "Tulips.jpg"); } 
}

// Define other methods and classes here
public void picturebox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    // https://stackoverflow.com/a/14143574/1016343
    System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(pathImg);
    System.Drawing.Point ulPoint = new System.Drawing.Point(0, 0);
    e.Graphics.DrawImage(bmp, ulPoint.X, ulPoint.Y, 175, 175);
}

Dadurch wird die folgende Grafik erstellt (die Bedienfeldelemente "Grafik" und "Bild" werden durch die obigen Beispiele hinzugefügt):

Showing_Graphic_in_LinqPad

Wenn Sie die Bilder aus der Northwind-Datenbank anzeigen möchten , haben Sie folgende
Möglichkeiten : Ändern Sie den Namen der Bilddatei in "NorthwindPics.jpg" und fügen Sie den folgenden Code am Anfang der Main () -Methode des zweiten Beispiels hinzu :

var img = (from e in this.Employees select e).FirstOrDefault().Photo.ToArray();
using (FileStream fs1 = new FileStream(pathImg, FileMode.Create))
{
    const int offset=78;
    fs1.Write(img, offset, img.Length-offset);
    fs1.Close();
}

Es liest den ersten Datensatz aus der Employees-Tabelle und zeigt das Bild an.

Weitere Informationen finden Sie unter den folgenden Links:
Formen und Grundzeichnung in benutzerdefinierten WPF
LinqPad-Visualisierern

Hinweis: Sie können dasselbe auch ohne den PanelManager erreichen, wie das folgende Beispiel zeigt, das ich hier gesehen habe :

// using System.Drawing;
using (var image=new Bitmap(100, 100))
using (var gr = Graphics.FromImage(image))
{
    gr.FillRectangle(Brushes.Gold, 0, 0, 100, 100);
    gr.DrawEllipse(Pens.Blue, 5, 5, 90, 90);
    gr.Save();
    image.Dump();
}

Es verwendet den .Dump()Befehl, um es anzuzeigen. Sie können image.Dump()mehrmals aufrufen und das Bild wird angehängt.


Windows Forms

Zeichnen Sie eine Grafik in LinqPad, Teil 2

Das folgende Beispiel, das von diesem Beitrag inspiriert wurde , zeigt, wie ein einfacher Funktionsplotter in Linqpad 5 mit C # 7 implementiert wird:

void Main()
{
    fnPlotter(x1: -1, x2: 1, fn: (double x) => Math.Pow(x, 3)).Dump();
}

public static Bitmap fnPlotter(double x1=-3, double x2=3, double s=0.05, 
                                   double? ymin=null, double? ymax=null, 
                                   Func<double, double> fn = null, bool enable3D=true)
{
    ymin = ymin ?? x1; ymax = ymax ?? x2;

    dynamic fArrPair(double p_x1 = -3, double p_x2 = 3, double p_s = 0.01, 
                          Func<double, double> p_fn = null)
    {
        if (p_fn == null) p_fn = ((xf) => { return xf; }); // identity as default
        var xl = new List<double>(); var yl = new List<double>();
        for (var x = p_x1; x <= p_x2; x += p_s)
        {
            double? f = null;
            try { f = p_fn(x); }
            finally
            {
                if (f.HasValue) { xl.Add(x); yl.Add(f.Value); }
            }
        }
        return new { Xs = xl.ToArray(), Ys = yl.ToArray() };
    }

    var chrt = new Chart(); var ca = new ChartArea(); chrt.ChartAreas.Add(ca);
    ca.Area3DStyle.Enable3D = enable3D;
    ca.AxisX.Minimum = x1; ca.AxisX.Maximum = x2;   
    ca.AxisY.Minimum = ymin.Value; ca.AxisY.Maximum = ymax.Value;

    var sr = new Series(); chrt.Series.Add(sr);
    sr.ChartType = SeriesChartType.Spline; sr.Color = Color.Red;
    sr.MarkerColor = Color.Blue; sr.MarkerStyle = MarkerStyle.Circle;
    sr.MarkerSize = 2;

    var data = fArrPair(x1, x2, s, fn); sr.Points.DataBindXY(data.Xs, data.Ys); 
    var bm = new Bitmap(width: chrt.Width, height: chrt.Height);
    chrt.DrawToBitmap(bm, chrt.Bounds); return bm;
}

Es nutzt die Funktion von LinqPad, um Windows-Formulare im Ergebnisfenster anzuzeigen. In Referenzen (Presse ) : , , und fügen Sie alle Namespaces aus diesen Baugruppen.
Beispiel
F4
System.Drawing.dllSystem.Windows.Forms.dllSystem.Windows.Forms.DataVisualization.dll


Zusätzliche Hinweise / weiterführende Literatur:

  • Möchten Sie LinqPad in Visual Studio verwenden ? So können Sie das machen .

  • Benötigen Sie LinqPad als "tragbare App" ? Lesen Sie hier, wie das geht.

  • Joes Website für LinqPad ist immer eine ausgezeichnete Quelle. In LinqPad erhalten Help -> What's NewSie Hinweise zu neuen Funktionen und Methoden. Das LinqPad-Forum enthält auch hilfreiche Hinweise.

  • Ebenfalls sehr hilfreich: Dieser Artikel über das Debuggen von Linq (Pad).

  • Verwenden Sie lprun.exefür LINQ - Abfragen laufen in Ihren Batch - Skripten. Lesen Sie diesen Artikel für weitere Details. Beispiel:
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    In diesem Beispiel ist die Abfrage ein einfacher LINQ-Ausdruck. Natürlich können Sie auch komplexe Abfragen vorbereiten -lang=program, um den Programmiermodus zu aktivieren.

  • Sie können Erweiterungsmethoden schreiben und auf der Registerkarte Meine Abfragen auf der linken Seite von LinqPad speichern: Das letzte Element des Baums heißt Meine Erweiterungen . Doppelklicken Sie darauf, um eine Datei zu öffnen, in die Sie Erweiterungen schreiben können, die für alle Ihre Abfragen verfügbar sind. Fügen Sie sie einfach in die öffentliche statische Klasse ein MyExtensionsund verwenden Sie die Main()Methode, um Tests für Ihre Erweiterungen einzuschließen.

Matt
quelle
2
Ich liebe den Tipp zu Util.ReadLine <string> ("Enter some json"). Früher habe ich es in eine Datei kopiert und dann von dort gelesen ... Ich liebe diesen Tipp wirklich. Vielen Dank!
Loneshark99
2

Dump ist eine globale Erweiterungsmethode und SubmitChanges stammt aus dem DataContext-Objekt, das ein System.Data.Linq.DataContext-Objekt ist.

LP fügt meines Wissens nur Dump and Disassemble hinzu. Ich würde es jedoch sehr empfehlen, es in Reflector zu öffnen, um zu sehen, was noch verwendet werden kann. Eines der interessantesten Dinge ist der LINQPad.Util-Namespace, der einige Extras enthält, die von LINQPad intern verwendet werden.

John
quelle
Hinweis: In neueren Versionen von LinqPad: Klicken Sie auf .Dump()oder eine andere Methode im Quellcode-Editor und drücken Sie F12, um zu "reflektieren". Dies ist jetzt in das Tool eingebaut!
Matt
1

Erreichte die Stackoverflow Text Grenze in meiner vorherigen Antwort , aber es gibt noch mehr coolen Erweiterungen in LinqPad. Einer von ihnen möchte ich erwähnen:


JavaScript-Funktionen (mit .Dump())

Seit der Beta- Version 5.42 von LinqPad können Sie JavaScript-Funktionen einbetten und direkt aus Ihrem C # -Code aufrufen. Obwohl dies einige Einschränkungen aufweist (im Vergleich zu JSFiddle), ist es eine gute Möglichkeit, schnell JavaScript-Code in LinqPad zu testen.

Beispiel:

void Main()
{
    // JavaScript inside C#
    var literal = new LINQPad.Controls.Literal("script",
    @"function jsFoo(x) { 
        alert('jsFoo got parameter: ' + x); 
        var a = ['x', 'y', 'z']; external.log('Fetched \'' + a.pop() + '\' from Stack');
        external.log('message from C#: \'' + x + '\''); 
    }"); 
    // render & invoke
    literal.Dump().HtmlElement.InvokeScript(true, "jsFoo", "testparam");
}

In diesem Beispiel wird eine Funktion jsFoomit einem Parameter vorbereitet und in der Variablen gespeichert literal. Dann wird es gerendert und über aufgerufen .Dump().HtmlElement.InvokeScript(...), wobei der Parameter übergeben wird testparam.

Die JavaScript-Funktion wird verwendet, external.Log(...)um Text in den Ausgabefenstern von LinqPad auszugeben und alert(...)eine Popup-Nachricht anzuzeigen.

Sie können dies vereinfachen, indem Sie die folgenden Erweiterungsklassen / -methoden hinzufügen :

public static class ScriptExtension
{
    public static object RunJavaScript(this LINQPad.Controls.Literal literal, 
                                       string jsFunction, params object[] p)
    {
        return literal.Dump().HtmlElement.InvokeScript(true, jsFunction, p);
    }
    
    public static LINQPad.Controls.Literal CreateJavaScript(string jsFunction)
    {
        return new LINQPad.Controls.Literal("script", jsFunction);
    }
}

Dann können Sie das vorherige Beispiel wie folgt aufrufen:

    // JavaScript inside C#
    var literal = ScriptExtension.CreateJavaScript(
    @"function jsFoo(x) { 
        alert('jsFoo got parameter: ' + x); 
        var a = ['x', 'y', 'z']; external.log('Fetched \'' + a.pop() + '\' from Stack');
        external.log('message from C#: \'' + x + '\''); 
    }"); 

    // render & invoke
    literal.RunJavaScript("jsFoo", "testparam");

Das hat den gleichen Effekt, ist aber leichter zu lesen (wenn Sie mehr JavaScript machen wollen ;-)).

Eine weitere Option, wenn Sie Lambda-Ausdrücke mögen und den Funktionsnamen nicht bei jedem Aufruf als Zeichenfolge angeben möchten, können Sie Folgendes tun:

var jsFoo = ScriptExtension.CreateJavaScript(
            @"function jsFoo(x) { ...  }"); 
ScriptExtension.RunJavaScript(() => jsFoo, "testparam");

vorausgesetzt, Sie haben die Hilfsfunktion hinzugefügt

public static object RunJavaScript(Expression<Func<LINQPad.Controls.Literal>> expr,  
                                   params object[] p)
{
    LINQPad.Controls.Literal exprValue = expr.Compile()();
    string jsFunction = ((MemberExpression)expr.Body).Member.Name;
    return exprValue.Dump().HtmlElement.InvokeScript(true, jsFunction, p);
}

zur Klasse ScriptExtension. Dadurch wird der von Ihnen verwendete Variablenname (hier jsFoo) aufgelöst, der zufällig mit der JavaScript-Funktion selbst identisch ist (Beachten Sie, wie der Lambda-Ausdruck zum Auflösen des Variablennamens verwendet wird. Dies kann nicht mithilfe nameof(paramName)der Funktion erfolgen).


.Dump () - Aktualisieren einer Nachricht inline

Manchmal ist es nützlich, den ausgegebenen Text zu überschreiben, anstatt ihn in eine neue Zeile zu setzen, z. B. wenn Sie eine lang laufende Abfrage durchführen und deren Fortschritt usw. anzeigen möchten (siehe auch ProgressBar unten). Dies kann mit a erfolgen DumpContainer. Sie können es wie in der Abbildung gezeigt verwenden

Beispiel 1:

void Main()
{
   var dc = new DumpContainer("Doing something ... ").Dump("Some Action");
   System.Threading.Thread.Sleep(3000); // wait 3 seconds
   dc.Content += "Done.";
}

DumpContainerAnimation

Beachten Sie, dass Sie für einige komplexere Objekte möglicherweise dc.UpdateContent(obj);eher als verwenden müssen dc.Content=....

Beispiel 2:

void Main()
{
    var dc = new DumpContainer().Dump("Some Action");
    for (int i = 10; i >= 0; i--)
    {
        dc.UpdateContent($"Countdown: {i}");
        System.Threading.Thread.Sleep(250);
    };
    dc.UpdateContent("Ready for take off!");
}

Util.ProgressBar

Das Anzeigen des Fortschritts kann auch mithilfe einer ProgressBar wie folgt erfolgen:

Beispiel:

void Main()
{
    var prog = new Util.ProgressBar("Processing").Dump();
    for (int i = 0; i < 101; i++)
    {
       Thread.Sleep(50); prog.Percent = i;
    }
    prog.Caption = "Done";
}

Dies ähnelt dem vorherigen Dump-Beispiel, zeigt jedoch diesmal eine schöne Fortschrittsbalkenanimation.


Unit-Test mit LinqPad - xUnit

Wussten Sie, dass Sie Unit-Tests in LinqPad schreiben können? Sie können beispielsweise das xUnit-Framework verwenden. Es ist über die NUGET-Unterstützung von LinqPad - via F4- im Dialogfeld verfügbar Add NUGET..... Hier finden Sie eine schrittweise Beschreibung der Verwendung von xUnit mit LinqPad V5 oder V6.


Wenn ich mehr entdecke, werde ich diese Antwort aktualisieren

Matt
quelle