Co to jest LINQ i do czego służy? [Zamknięte]

126

Co to jest LINQ? Wiem, że to dla baz danych, ale co to robi?

Kredns
źródło
20
Uważam, że pokonałem kryteria „nie można rozsądnie odpowiedzieć”. Nie ma powodu, aby to pytanie zostało zamknięte.
Amy B
1
Posłuchaj twórcy LINQ, Erika Meijera, powiedz, co to jest. BTW, to nie jest tylko dla bazy danych.
Sнаđошƒаӽ

Odpowiedzi:

171

LINQ to skrót od Language Integrated Query .

Zamiast pisać YAQL (Yet Another Query Language), programiści języka Microsoft udostępnili sposób wyrażania zapytań bezpośrednio w swoich językach (takich jak C # i Visual Basic). Techniki tworzenia tych zapytań nie opierają się na szczegółach implementacji obiektu, którego dotyczy zapytanie, dzięki czemu można pisać prawidłowe zapytania względem wielu celów (baz danych, obiektów w pamięci, XML), praktycznie bez uwzględnienia podstawowego sposobu, w jaki zapytanie zostanie wykonane.

Zacznijmy tę eksplorację od części należących do .NET Framework (3.5).

  • LINQ To Objects - zbadaj System.Linq.Enumerable pod kątem metod zapytań. Te elementy docelowe IEnumerable<T>, umożliwiając odpytywanie dowolnej kolekcji, która może być zapętlona, ​​w sposób bezpieczny dla typu. Te zapytania opierają się na skompilowanych metodach .NET, a nie na wyrażeniach.

  • LINQ To Anything - sprawdź System.Linq.Queryable dla niektórych metod zapytań. Są one docelowe IQueryable<T>, umożliwiając konstrukcję drzew wyrażeń, które mogą być tłumaczone przez podstawową implementację.

  • Drzewa wyrażeń - zbadaj przestrzeń nazw System.Linq.Expressions . To jest kod jako dane. W praktyce powinieneś być tego świadomy, ale tak naprawdę nie musisz pisać kodu dla tych typów. Funkcje językowe (takie jak wyrażenia lambda) pozwalają na użycie różnych krótkich rąk, aby uniknąć bezpośredniego kontaktu z tymi typami.

  • LINQ To SQL - zbadaj przestrzeń nazw System.Data.Linq . Szczególnie zwróć uwagę na DataContext. Jest to technologia DataAccess stworzona przez zespół C #. Po prostu działa.

  • LINQ To Entities - sprawdź przestrzeń nazw System.Data.Objects . Szczególnie zwróć uwagę na ObjectContext. Jest to technologia DataAccess stworzona przez zespół ADO.NET. Jest złożony, potężny i trudniejszy w użyciu niż LINQ To SQL.

  • LINQ To XML - zbadaj przestrzeń nazw System.Xml.Linq . Zasadniczo ludzie nie byli zadowoleni z zawartości System.Xml. Dlatego firma Microsoft napisała go ponownie i skorzystała z ponownego zapisu, aby wprowadzić niektóre metody, które ułatwiają używanie LINQ To Objects względem XML.

  • Kilka fajnych typów pomocników, takich jak Func i Action . Te typy są delegatami z ogólną pomocą techniczną. Dawno minęły czasy deklarowania własnych niestandardowych (i niewymienialnych) typów delegatów.

Wszystko to jest częścią platformy .NET Framework i jest dostępne w dowolnym języku .NET (VB.NET, C #, IronPython, COBOL .NET itp.).


Ok, przejdźmy do funkcji językowych. Mam zamiar trzymać się C #, ponieważ to wiem najlepiej. VB.NET również miał kilka podobnych ulepszeń (i kilka, których C # nie dostał - literały XML). To jest krótka i niepełna lista.

  • Metody rozszerzające - pozwala to „dodać” metodę do wpisywania. Ta metoda jest w rzeczywistości metodą statyczną, do której jest przekazywana instancja typu i jest ograniczona do kontraktu publicznego typu, ale jest bardzo przydatna do dodawania metod do typów, których nie kontrolujesz (ciąg znaków) lub dodawania (w pełni zaimplementowana ) metody pomocnicze do interfejsów.

  • Składnia rozumienia zapytania - pozwala na pisanie w strukturze podobnej do SQL. Wszystkie te rzeczy są tłumaczone na metody w System.Linq.Queryable lub System.Linq.Enumerable (w zależności od typu myCustomers). Jest to całkowicie opcjonalne i bez niego możesz dobrze używać LINQ. Jedną z zalet tego stylu deklaracji zapytań jest to, że zmienne zakresu mają określony zakres: nie trzeba ich ponownie deklarować dla każdej klauzuli.

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
  • Wyrażenia lambda - to jest skrót określający metodę. Kompilator C # przetłumaczy każdy z nich na metodę anonimową lub true System.Linq.Expressions.Expression. Naprawdę musisz je zrozumieć, aby dobrze używać Linq. Istnieją trzy części: lista parametrów, strzałka i treść metody.

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
  • Typy anonimowe - czasami kompilator ma wystarczająco dużo informacji, aby utworzyć typ za Ciebie. Te typy nie są naprawdę anonimowe: kompilator nadaje im nazwy, gdy je tworzy. Ale te nazwy są tworzone w czasie kompilacji, czyli za późno, aby programista mógł użyć tej nazwy w czasie projektowania.

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
  • Typy niejawne - czasami kompilator ma wystarczającą ilość informacji z inicjalizacji, aby określić typ za Ciebie. Możesz poinstruować kompilator, aby to zrobił, używając słowa kluczowego var. Niejawne wpisywanie jest wymagane do deklarowania zmiennych dla typów anonimowych, ponieważ programiści nie mogą używać nazwy typu anonimowego .

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);
Amy B.
źródło
14

LINQ (Language INtegrated Query) może odnosić się do:

  • biblioteka do manipulacji kolekcjami i iteratorami, która szeroko wykorzystuje funkcje wyższego rzędu jako argumenty (System.Linq)

  • biblioteka do przekazywania i manipulowania prostymi funkcjami jako abstrakcyjnymi drzewami składni (System.Linq.Expressions)

  • rozszerzenie składni dla różnych języków w celu zapewnienia składni bardziej podobnej do SQL do przetwarzania kolekcji, bardziej zwartej notacji dla funkcji anonimowych oraz mechanizmu wprowadzania statycznych funkcji pomocniczych, których składniowo nie da się odróżnić od końcowych funkcji składowych

  • definicja interfejsu, do której dostawcy danych mogą się dostosować, aby otrzymać strukturę zapytania i potencjalnie przeprowadzić na niej optymalizację, lub czasami sami kompatybilni dostawcy danych

Komponenty mogą być używane oddzielnie lub w połączeniu.

Jeffrey Hantin
źródło
10

W skrócie, LINQ (zapytanie zintegrowane z językiem) umożliwia pisanie zapytań bezpośrednio w kodzie. Te zapytania mogą dotyczyć relacyjnych baz danych, ale także XML lub obiektów kontenerów w pamięci, takich jak tablice i listy. Więcej informacji można znaleźć w bibliotece MSDN: http://msdn.microsoft.com/en-us/library/bb308959.aspx

Vojislav Stojkovic
źródło
jest to precyzyjne i zwięzłe.
SSD
6

Spróbuję uzyskać prostą odpowiedź: LINQ to sposób na wysłanie zapytania do bazy danych (lub innego magazynu danych, XML itp.) Przy użyciu języka zapytań, który jest podobny do SQL, ale można go skompilować w aplikacji .NET.

jcollum
źródło
1
Więc jaka dokładnie jest różnica między Linq a SQL?
Kredns
Myślę, że jest to bardziej wyrafinowana nazwa, ale struktury różnią się: SQL to Select From Where, a LINQ to From Where Select. LINQ jest łatwiejszy do zapętlenia z. LINQ jest po prostu łatwiejsze :), a generowany przez niego SQL jest zwykle wystarczająco dobry, biorąc pod uwagę oszczędność czasu.
jcollum
2
szczerze mówiąc, można argumentować, że SQL powinien być zapisany jako From Where Select, etc.- tj. powinien być napisany w taki sposób, w jaki zestaw wyników jest faktycznie tworzony
Don Cheadle
6

LINQ to skrót od Language Integrated Query i jest sposobem na zapewnienie mechanizmu „zapytań” ogólnego przeznaczenia w środowisku CLR.

Na najbardziej podstawowym poziomie składa się z zestawu metod w IEnumerable <T> - np. Select, Sum, Where - które mogą być używane do ograniczeń, prognoz itp. [1]

Aby pójść dalej, LINQ definiuje również nowy model dostawcy LINQ, który może przyjmować drzewo wyrażeń i używać go do uruchamiania zapytań „natywnych” względem źródła danych poza CLR - np. LINQ to SQL, LINQ to XML, LINQ do NHibernate itp.

C # i VB.NET zdefiniowały również składnię zapytań, która umożliwia pisanie wbudowanych zapytań o silnym typie (które wygląda bardzo podobnie do SQL), które kompilator następnie tłumaczy na równoważne wywołania IEnumerable <T>.

Dla mnie najbardziej interesującą rzeczą w LINQ jest to, że wszystkie funkcje C # i VB.NET, które były potrzebne do jego obsługi, są przydatne same w sobie. Metody rozszerzające, typy anonimowe, wyrażenia lambda i niejawne typowanie były wymagane do obsługi LINQ - ale zwykle używamy tych funkcji poza czystym kontekstem LINQ.

[1] Są to terminy relacyjne, programiści funkcyjni prawdopodobnie woleliby Mapowanie, Zmniejszanie, Składanie itp.

Mark Brackett
źródło
5

LINQ to technologia wyodrębniania danych przy użyciu idiomu pochodzącego z języka programowania C #. Chociaż wiele zawdzięcza projektowi funkcjonalnemu SQL, jest zasadniczo własnym językiem zapytań o dane. Działa w szerokim spektrum źródeł danych (bazy danych SQL, reprezentacje w pamięci, XML itp.). W szczególności LINQ-To-SQL należy postrzegać jako przeciwieństwo tradycyjnego stosowania wbudowanego języka SQL, które cierpi z powodu czegoś, co często określa się jako „niezgodność impedancji” między programowaniem w języku SQL a programowaniem w języku C # / VB.

Aby zapoznać się z omówieniem LINQ i jego ograniczeniami, możesz rzucić okiem na to pokrewne pytanie: Czy LINQ to SQL nie pomija sedna sprawy?

Mark Brittingham
źródło
0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

„Projekt LINQ to nazwa kodowa zestawu rozszerzeń platformy .NET Framework, które obejmują operacje zapytań, ustawiania i przekształcania zintegrowane z językiem. Rozszerza on język C # i Visual Basic o składnię w języku ojczystym dla zapytań i udostępnia biblioteki klas do wykorzystania te możliwości ”.

Jobo
źródło
Czy to dotyczy baz danych? To, co tu widziałem (w SO), jest bardziej podobne do kolekcji w środowisku .net.
OscarRyz