Metody LINQPad [extension]

Czy ktoś ma pełną listę metod i metod rozszerzenia LINQPad, takich jak

.Dump()

SubmitChanges()
Author: Matt, 2010-08-24

3 answers

LINQPad definiuje dwie metody rozszerzenia (w LINQPad.Rozszerzenia), mianowicie Dump() i Disassemble(). Dump() zapisuje do okna wyjściowego za pomocą formatera wyjściowego LINQPad i jest przeciążony, aby umożliwić podanie nagłówka:

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

Można również określić maksymalną głębokość rekurencji, aby zastąpić domyślne 5 poziomów:

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() dezasembluje dowolną metodę do IL, zwracając wyjście w łańcuchu znaków:

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

Oprócz tych dwóch metod rozszerzenia, istnieje kilka przydatne metody statyczne w LINQPad.Util. Są one udokumentowane w autocompletion i obejmują:

  • Cmd - wykonuje polecenie powłoki lub zewnętrzny program
  • CreateXhtmlWriter-tworzy tekst, który używa Formatera Dump () Linqpada.]}
  • SqlOutputWriter - zwraca tekst zapisujący do okna wyjścia SQL
  • GetMyQueries, GetSamples - zwraca zbiór obiektów reprezentujących Twoje zapisywane zapytania | próbki (dla przykładu wykonaj wyszukiwanie za pomocą Edytuj / Szukaj wszystko)
  • Podświetl - otacza obiekt tak, aby podświetlił się na Żółto po zrzuceniu
  • HorizontalRun - pozwala na zrzut szeregu obiektów w tej samej linii

LINQPad dostarcza również klasę HyperLinq. Ma to dwa cele: pierwszym jest wyświetlanie zwykłych hiperłączy:

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

Możesz połączyć to z Util.HorizontalRun:

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

Wynik:

Sprawdź ta strona , aby uzyskać odpowiedzi na pytania dotyczące programowania.

Drugi cel HyperLinq to dynamiczne budowanie zapytań:
// 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();

Możesz również napisać własne metody rozszerzeń w LINQPad. Przejdź do "Moje zapytania" i kliknij Zapytanie o nazwie "Moje rozszerzenia". Wszystkie typy / metody, które tu definiują, są dostępne dla wszystkich zapytań:

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

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

W 4.46(.02) nowe klasy i metody zostały wprowadzone :

  • DumpContainer (class)
  • OnDemand (metoda rozszerzenia)
  • Util.ProgressBar (class)

Dodatkowo, Klasa Hyperlinq obsługuje terazakcję delegat, który zostanie wywołany po kliknięciu łącza, co pozwala reagować na niego kodem, a nie tylko linkiem do zewnętrznych stron internetowych.

DumpContainer jest klasą, która dodaje blok do okna wyjściowego, który może mieć swoją zawartość zastąpiony.

Uwaga! pamiętaj, aby .Dump() DumpContainer znaleźć się w odpowiednim miejscu.

Do użycia:

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

OnDemand jest metodą rozszerzenia, która nie wyświetla zawartości swojego parametru do okna wyjściowego, ale zamiast tego dodaje klikalny link, który po kliknięciu zastąpi link z zawartością .Dump()ed parametru. Jest to świetne rozwiązanie dla czasami potrzebnych struktur danych, które są kosztowne lub zajmują dużo miejsca.

Uwaga! Pamiętaj, aby .Dump() wyniki wywołania OnDemand w odpowiednim miejscu.

Aby go użyć:

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

Util.ProgressBar jest klasą, która może wyświetlać graficzny pasek postępu wewnątrz okna wyjściowego, który może być zmieniany w miarę przesuwania się kodu.

Uwaga! pamiętaj o .Dump() Util.Obiekt paska postępu w odpowiednim miejscu.

Aby go użyć:

var pb = new Util.ProgressBar("Analyzing data");
pb.Dump();
for (int index = 0; index <= 100; index++)
{
    pb.Percent = index;
    Thread.Sleep(100);
}
 221
Author: Joe Albahari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-09 21:13:08

Poza dobrze znaną myQuery.Dump("Query result:"), kolejną cechą, o której warto wspomnieć, jest klasa Util: zawiera ona wiele przydatnych metod(niektóre z nich wspomniałem, ale jest ich o wiele więcej).

Interesujące jest również to, że można łatwo zmodyfikować sposób Dump() Działa.

Na koniec pokażę Ci, jak możesz wprowadzać zmiany na stałe (np. wstawiać, aktualizować, usuwać zapytania LINQ) używając SubmitChanges() lub SaveChanges(), a także jak możesz uzyskać dostęp do wewnętrznego obiekt połączenia LinqPad.

I aby go zaokrąglić, pokażę Ci, jak możesz tworzyć proste grafikę 2d wewnątrz Linqpada(rysowanie linii, bitmapy lub funkcje ).

Oto zbiór wbudowanych funkcji Linqpada (z własnego doświadczenia z narzędziem):

.Dump ()

(parametry dostępne w LinqPad v5.03.08 i nowszych)

Wszyscy użytkownicy LinqPad znają i kochają zaawansowana metoda rozszerzenia .Dump(), która zużywa i drukuje (prawie) wszystko.

Ale czy wiesz, że jest kilka parametrów dostępnych? Spójrz na ten fragment kodu:

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

pierwszy przykład wyświetla tylko zmienne a i c i ukrywa b i d, drugi przykład robi odwrotnie (zauważ, że określa tylko 2 z dostępnych parametrów). Zmienney i z nie mogą być ukryte indywidualnie, ponieważ nie są na najwyższym poziomie.

Dostępne są następujące parametry (wszystkie są opcjonalne):

  • description [string] - dostarcza opis obiektu do zrzutu
  • depth [int?]- ogranicza głębokość obiektów rekurencyjnie sprawdzanych
  • toDataGrid [bool] - jeśli true, wyjście jest sformatowane jako datagrid, a nie jako RichText
  • exclude [string] - jeśli podasz oddzieloną przecinkami listę zmiennych, to zostanie wykluczone z wyjścia (w przykładzie" A, c": b i d są pokazane, a i c są ukryte)
  • exclude [string] z prefiksem " + " - prefiks odwraca logikę parametru exclude. Oznacza to, że jeśli podasz oddzieloną przecinkami listę zmiennych, wszystkie z wyjątkiem podanych są ukryte (w przykładzie "+b,d": b i d są pokazane, wszystkie pozostałe są ukryte)
  • przechowuj włączone i wyłączone właściwości w zmiennej (nowe od LinqPad V5.09.04):
    var x=Util.ToExpando(obj, "a, c", "b, d"); x.Dump();
    pierwszy łańcuch zawiera listę właściwości do włączenia, drugi łańcuch listę do wykluczenia
  • rozwiń po kliknięciu: jeśli użyjesz .OnDemand("click me").Dump(); zamiast .Dump(), wyświetli się link, który możesz kliknąć, aby rozwinąć. Przydatne, jeśli chcesz sprawdzić wartości, np. Util.OnDemand("Customer-ID: " + customerObject.ID.ToString(), ()=>customerObject, false).Dump();, aby zawsze pokazywać ID domyślnie, ale ujawniać szczegóły customerObject tylko wtedy, gdy jesteś zainteresowany.

Bardziej zaawansowane tematy na temat zrzutu można znaleźć tutaj .


Środowisko

To nie jest rozszerzenie LinqPad, ale raczej Klasa. NET, ale ponieważ jest przydatna, i tak o niej wspomnę. Możesz uzyskać wiele przydatnych informacji, które możesz wykorzystać w swoich skryptach, takich jak:

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

N. B. do uzyskania Domain\UserName użyłbym System.Security.Principal.WindowsIdentity.GetCurrent().Name
zamiast Environment.UserDomainName+@"\"+Environment.UserName.


Util.WriteCsv

(nowy: dostępny od LinqPad w wersji v4.45.05 (beta))

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

Spowoduje zapis zawartości tabeli Customers do pliku CSV c:\temp\customers.csv. Możesz również znaleźć dobry przykład użycia Util.WriteCsv, a następnie wyświetlić dane CSV w oknie wyniku Linqpada tutaj.

Podpowiedzi:

  • Aby uzyskać / utworzyć plik CSV, który znajduje się w tym samym katalogu co zapytanie, możesz użyć:
    var csvFile=Util.CurrentQueryPath.Replace(".linq", ".csv");

  • Jeśli tabela jest duża, użyj ObjectTrackingEnabled = false; zanim napiszesz plik CSV, aby uniknąć buforowanie go w pamięci.

  • Jeśli chcesz wypisać tabelę w formacie XML zamiast jako plik rozdzielany przecinkami, możesz to zrobić w następujący sposób:

    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();
    

    Ten przykład zwraca wszystkie elementy posiadające atrybut attr1, który zawiera wartość "a" z pliku XML, który ma tę samą nazwę co zapytanie i jest zawarty w tej samej ścieżce. Sprawdź ten link, aby uzyskać więcej kodu próbki.


Util.GetPassword

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

Spowoduje to pobranie hasła z wbudowanego menedżera haseł LinqPad. Aby utworzyć I zmienić hasło, otwórz "Menedżer haseł" pozycja menu w "Plik" menu Linqpada. Jeśli po uruchomieniu kodu C# nie zostanie zapisane takie hasło, otworzy się okno dialogowe hasło z prośbą o podanie hasła i możesz je utworzyć i zapisać w locie, sprawdzając Zapisz hasło pole wyboru (w przykładzie hasło dla "UserXY" zostanie zapisane, a później można znaleźć ten wpis w Password manager ).

Zaletą jest to, że możesz przechowywać hasło w Linqscriptach, które tworzysz bezpiecznie, oddzielnie i zaszyfrowane w profilu użytkownika systemu Windows (jest ono przechowywane w %localappdata%\LINQPad\Passwords jako plik). LinqPad używa Windows DPAPI do ochrony hasła.

Ponadto hasło jest przechowywane centralnie, więc jeśli chcesz je zmienić, możesz to zrobić to w menu i natychmiast odnosi się do wszystkich skryptów, które utworzyłeś.

Uwagi:

  • Jeśli nie chcesz zapisać hasła i po prostu wywołać okno dialogowe hasła, możesz użyć drugiego parametru w następujący sposób:
    var pwd = Util.GetPassword("UserXY", true);
    Spowoduje to odznaczenie Zapisz hasło pole wyboru w oknie dialogowym hasło (jednak użytkownik nadal może je sprawdzić i wybrać zapisanie).

  • Jeśli hasło ma być przechowywany w SecureString, możesz użyć tej funkcji pomocniczej (N. b.: aby użyć metody rozszerzenia .ToSecureString(), wykonaj ten link w Stackoverflow - pozwala również na konwersję z powrotem w razie potrzeby):
    System.Security.SecureString GetPasswordSecure(string Name, bool noDefaultSave=true)
    {
      return Util.GetPassword(Name, noDefaultSave).ToSecureString();
    }


Util.Cmd

Ta metoda działa jak procesor poleceń. Możesz wywołać wszystkie polecenia, które znasz z konsoli Windows.

Przykład 1 - dir:

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

To wyświetli wynik katalogu bez potrzeby .Dump. Przechowywanie go w zmiennej ma tę zaletę, że można na nim korzystać z dalszych zapytań Linq. Na przykład:

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();

Spowoduje to zrzucenie wszystkich plików z rozszerzeniami plików".exe" lub ".dll " zawarte w C:\windows\system32. Przełącznik /s jest używany do rekurencji wszystkich podkatalogów, a {[93] } jest używany do gołego formatu wyjściowego. Zauważ, że drugi parametr metody Cmd jest określony w celu powstrzymania wyjście konsoli w celu wyświetlenia tylko przefiltrowanego wyniku za pomocą metody Dump.

Widać, że jest to bardziej elastyczne niż symbole wieloznaczne, które masz z dir, ponieważ możesz korzystać z pełnej elastyczności silnika zapytań Linq.

Przykład 2-edytor tekstu:

Możesz otworzyć plik w notatniku w następujący sposób:

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

Util.Obraz

Wyświetla obrazy z adresu URL. Przykład:

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.Postęp

Użycie Util.ProgressBar pozwala na wyświetlenie paska postępu. Można użyć następującej klasy pomocniczej:

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;
        }
    }
}

Po prostu użyj go, jak pokazuje poniższy przykład:

void Main()
{
    var pb1= new ProgressBar();
    Thread.Sleep(50);
    pb1.Update(50, "Doing something"); Thread.Sleep(550);
    pb1.Update(100); Thread.Sleep(50);
}
Możesz również użyć Util.Progress, aby zaktualizować zintegrowany pasek postępu LinqPads, na przykład:
Util.Progress = 25; // 25 percent complete

Różnica polega na tym, że nie wyświetli się w oknie wyników i nie można przypisać do niego wiadomości.


Util.RawHtml

Wyświetla HTML w okno wyjściowe. Przykład:

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

Hyperlinq, Util.HorizontalRun

Możesz użyć tej przykładowej funkcji

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);
}

Wyświetlanie hiperłączy w oknie wyników - lub dowolnych działań, takich jak otwarcie ulubionego edytora. użycie:

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

Zauważ , że ta funkcja zawsze działa, podczas gdy new Hyperlinq ("http://myURL", "Web site").Dump(); nie działa dla niektórych adresów URL (szczególnie, jeśli musisz podać nazwy portów, takie jak": 1234 " jako część URL).


Util.ReadLine

Odczytuje dane wejściowe z konsoli. Przykład:

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

Jako synonim Util.ReadLine<string>() można również użyć Console.ReadLine().

Ale to nie wszystko! Możesz utworzyć prosty parser JSON z następującym fragmentem - bardzo przydatnym, na przykład, jeśli chcesz analizować i testować ciąg JSON w locie. zapisz poniższy fragment jako JSONAnalyzer.linq używając edytora tekstu , a następnie otwórz go w LinqPad (to jest łatwe dodawanie referencji w locie):
<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");
}

Teraz możesz go uruchomić i po prostu wkleić ciąg JSON ze schowka do konsoli - użyje ona funkcji Dump, aby ładnie wyświetlić go jako obiekt - a także otrzymasz komunikaty o błędach parsera na ekranie, aby rozwiązać problemy. Bardzo przydatne do debugowania AJAX.

JSON


Util.ClearResults

Jeśli chcesz wyczyścić okno wyników wewnątrz skryptu, zastosowanie:

Util.ClearResults();

Użyj go na początku skryptu lub - jeśli uruchamiasz wiele zapytań w skrypcie-poczekaj na wejście użytkownika przed zaśmieceniem ekranu(np. poprzedzając go Util.ReadLine).


Zwyczaj .Dump () - ICustomMemberProvider

Interesujące jest również to, że można wpływać na wynik metody .Dump(). Po prostu zaimplementuj interfejs ICustomMemberProvider, np.

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
}

Jeśli utworzysz instancję tej klasy, jak

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

Wtedy wyświetli tylko Hint, constMember1, constMember2, i myprop, ale nie własności xyz:

Linqpad dump


Wyświetlanie MessageBox lub InputBox w LinqPad

Jeśli chcesz wyświetlić messagebox, spójrz tutaj jak to zrobić.

Na przykład, możesz wyświetlić skrzynkę wejściową, używając następującego kodu

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
    }
}

(nie zapomnij wcisnąć F4 i dodać Microsoft.VisualBasic.dll i jego przestrzenie nazw, aby ta praca)


Util.Run

(nowy: dostępny od LinqPad w wersji v4. 52. 1 (beta))

Pozwala na uruchomienie innego skryptu Linqpada z twojego skryptu lub własnego programu. NET lub usługi Windows (odwołując się do wersji LINQPad.exe LINQPad4-AnyCPU). Wykonuje skrypt tak, jak zrobiłoby to narzędzie wiersza poleceń lprun.exe.

Przykłady:

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

Ten przykład uruchamia skrypt foo.linq, który zawiera następujący przykładowy kod:

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");
}

Pozwala na rozróżnienie, czy skrypt został uruchomiony z poziomu interfejsu graficznego Linqpada, czy przez lprun.exe lub przez Util.Run.

Uwaga: pomocne mogą być następujące warianty inwokacji:

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 do SQL

Jeśli używasz LinqToSQL , możesz chcieć wprowadzić zmiany na stałe (dla operacji insert/update/delete). Ponieważ kontekst bazy danych jest domyślnie tworzony przez LinqPad, musisz wywołać SubmitChanges() po każdej zmianie, Jak pokazano poniżej.

Przykłady dla (LinqPad -) Northwind baza danych:

Insert

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

Update

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

Delete

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

Uwaga: aby uzyskać poprawne Identyfikatory dla poprzednich przykładów, możesz użyć:

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

var pID = Products.Count()+1;

Zanim wywołasz oni.


SaveChanges () - Entity Framework

Jeśli używasz struktury Entity Framework , możesz również wprowadzić zmiany na stałe (dla operacji insert/update/delete). Ponieważ kontekst bazy danych jest niejawnie tworzony przez LinqPad, musisz wywołać SaveChanges() po każdej zmianie, Jak pokazano poniżej.

Przykłady są w zasadzie takie same jak wcześniej dla LinqToSQL , ale zamiast tego musisz użyć SaveChanges(), a do wstawiania i usuwanie metod również się zmieniło.

Insert

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

Update

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

Delete

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

Uwaga: aby uzyskać poprawne Identyfikatory dla poprzednich przykładów, możesz użyć:

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

var pID = Products.Count()+1;

Zanim je przywołasz.


This - database context

W LinqPad , kontekst bazy danych jest ustalany automatycznie za pomocą combobox na górze i wybranie odpowiedniej bazy danych dla Twojego zapytania. Ale czasami, jest to przydatne, aby odwołać się do niego jawnie, na przykład, jeśli skopiujesz kod z projektu z Visual Studio, i wklej go do LinqPad.

Twój fragment kodu zaczerpnięty z projektu Visual Studio prawdopodobnie wygląda tak:

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

Co teraz zrobić z dc? Oczywiście możesz usunąć każde wystąpienie dc. w zapytaniu, ale jest to znacznie łatwiejsze. Just dodaj

var dc=this; // UserQuery

Do góry twojego fragmentu tak:

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(); 
}   

I Kod będzie działać natychmiast!


To.Połączenie

Korzystanie z Linqpada z OleDb, konwersja danych do obiektu Linq, zapytania SQL w Linq

Poniższy fragment kodu pomaga używać Linqpada z OleDb. Dodaj System.Data.OleDb z zestawu System.Data do właściwości zapytania, a następnie wklej następujący kod do 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();

Teraz dodaj Połączenie SqlServer z LinqPad i dodanie bazy danych Northwind w celu uruchomienia tego przykładu.

Uwaga: jeśli chcesz uzyskać bazę danych i serwer aktualnie wybranego połączenia, możesz użyć tego fragmentu kodu:

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();
}

Możesz nawet przekonwertować myDS na Linq, odpowiedzi na poniższe pytanie pokazują, jak to zrobić: ładne przykłady użycia dynamicznego słowa kluczowego. NET 4 z Linq

Jeszcze jeden przykład: załóżmy, że Twój DBA daje Ci zapytanie SQL i chcesz analizować wyniki w LinqPad - oczywiście w Linq, a nie w SQL. Następnie możesz wykonać następujące czynności:

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;
}

W tym przykładzie zapytanie SELECT DBA jest po prostu "wrzucane" do tekstu polecenia, a wyniki są filtrowane i uporządkowane według miasta.
Oczywiście jest to uproszczony przykład, twój DBA prawdopodobnie obsługiwałby Cię bardziej złożonym skryptem, ale wpadasz na pomysł: po prostu dodaj wspierającą klasę wynikową, która zawiera wszystkie pola z klauzula SELECT, a następnie można z niej bezpośrednio korzystać.
Możesz nawet pobrać wynik z procedury składowanej w ten sposób i użyć go w Linq. Jak widać, w tym przykładzie nie dbam o typ danych i używam dynamic, aby go wyrazić.
Tak więc chodzi o szybkie programowanie, aby móc szybko analizować dane. Nie powinieneś tego robić w swojej prawdziwej aplikacji z różnych powodów (SQL injection, ponieważ możesz używać EF od początku itp.).


PanelManager

Rysowanie grafiki w LinqPad, Część 1

Aby skorzystać z poniższych przykładów, naciśnij F4 i dodaj System.Windows.dll, System.Windows.Forms.dll, WindowsFormsIntegration.dll, PresentationCore.dll i PresentationFramework.dll do programu LinqPad, a także dodać przestrzeń nazw System.Windows.Shapes.

Pierwszy przykład po prostu rysuje linię:

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");

Drugi przykład pokazuje, w jaki sposób można wyświetlać grafikę w LinqPad za pomocą Menedżera PanelManager. Normalnie LinqPad obsługuje tylko obiekty Wpf. Ten przykład wykorzystuje System.Windows.Forms.Integration.WindowsFormsHost, aby udostępnić Windows.Forms.PictureBox (zainspirowany to):

// 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);
}

Spowoduje to wytworzenie następującej Grafiki (elementy panelu "Grafika" i "Obrazek" są dodawane przy pomocy powyższych przykładów):

Showing_Graphic_in_LinqPad

Jeśli chcesz wyświetlić obrazy z bazy danych Northwind, możesz wykonać następujące czynności:
Zmień nazwę pliku obrazu na " NorthwindPics.jpg", następnie dodaj następujący kod na początku drugiej metody Main ():

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();
}

Odczyta pierwszy rekord z tabeli pracowników i wyświetli zdjęcie.

Sprawdź poniższe linki, aby dowiedzieć się więcej:
kształty i podstawowe rysowanie w WPF
LinqPad custom visualizers

Uwaga: możesz osiągnąć to samo również bez Panelmanagera, jak w poniższym przykładzie, który widziałem tutaj pokazuje:

// 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();
}

Używa polecenia .Dump(), aby go wyświetlić. Możesz wywołać image.Dump() wiele razy, a to doda obraz.


Windows Forms

Rysowanie grafiki w LinqPad, część 2

Poniższy przykład, zainspirowany to post pokazuje, jak zaimplementować prosty Ploter funkcyjny w Linqpad 5 przy użyciu C # 7:

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;
}

Wykorzystuje możliwości Linqpada do wyświetlania formularzy Windows w panel wyników.
Przykład
Dodaj referencje (naciśnij F4):
System.Drawing.dll, System.Windows.Forms.dll, System.Windows.Forms.DataVisualization.dll
i dodaj wszystkie przestrzenie nazw z tych zestawów.


Dodatkowe wskazówki / Czytaj dalej:

  • Chcesz używać Linqpada w Visual Studio? Oto jak możesz to zrobić .

  • Musisz mieć LinqPad jako "przenośną aplikację" ? Czytaj tutaj jak to zrobić.

  • Strona Joe dlaLinqPad jest zawsze doskonałym źródłem. Wewnątrz Linqpada, Help -> What's New daje wskazówki o nowych funkcjach i metodach. Forum LinqPad zawiera również pomocne wskazówki.

  • Również bardzo pomocne: ten artykuł o debugowaniu Linq (Pad).

  • Użycie lprun.exe dla uruchamiania zapytań LINQ w skryptach wsadowych . Czytaj ten artykuł po więcej szczegółów. Na przykład:
    echo Customers.Take(100) > script.txt
    lprun -lang=e -cxname=CompanyServer.CustomerDb script.txt
    W tym przykładzie zapytanie jest prostym wyrażeniem LINQ. Oczywiście możesz również przygotować złożone zapytania za pomocą -lang=program, aby aktywować tryb programu.

  • Możesz napisać własne metody rozszerzeń i zapisać je w zakładce My Queries po lewej stronie Linqpada: ostatnia Pozycja drzewa ma nazwę My Extensions ; kliknij na nią dwukrotnie, aby otworzyć plik gdzie można pisać rozszerzenia, które są dostępne dla wszystkich zapytań. Po prostu umieść je w publicznej klasie statycznej MyExtensions i użyj metody Main(), aby dołączyć testy dla swoich rozszerzeń.

 116
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-19 11:33:22

Dump jest globalną metodą rozszerzenia i SubmitChanges pochodzi z obiektu DataContext, który jest systemem.Data.Linq.Obiekt DataContext.

LP dodaje tylko Dump i Disassemble o ile mi wiadomo. Chociaż Gorąco polecam otwarcie go w reflektorze, aby zobaczyć, co jeszcze można użyć. Jedną z ciekawszych rzeczy jest LINQPad.Przestrzeń nazw Util, która ma pewne gadżety używane wewnętrznie przez LINQPad.

 2
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-25 01:04:37