Jaka jest różnica między „LINQ to Entities”, „LINQ to SQL” i „LINQ to Dataset”

91

Pracuję już od dłuższego czasu z LINQ. Jednak pozostaje trochę tajemnicą, jakie są rzeczywiste różnice między wspomnianymi odmianami LINQ.

Udana odpowiedź będzie zawierała krótkie rozróżnienie między nimi. Jaki jest główny cel każdego smaku, jakie są korzyści i czy ma to wpływ na wydajność ...

PS Wiem, że istnieje wiele źródeł informacji, ale szukam czegoś w rodzaju „ściągawki”, która instruuje nowicjusza, gdzie ma zmierzać do konkretnego celu.

Marcel
źródło
2
Zobacz także stackoverflow.com/questions/2438672
Henk Holterman,

Odpowiedzi:

110
  • wszystkie z nich są LINQ - Language Integrated Query - więc wszystkie mają wiele cech wspólnych. Wszystkie te „dialekty” zasadniczo pozwalają na wybieranie danych z różnych źródeł w stylu zapytań.

  • Linq-to-SQL to pierwsza próba Microsoftu w ORM - Object-Relational Mapper. Obsługuje tylko SQL Server. Jest to technologia mapowania służąca do mapowania tabel bazy danych programu SQL Server na obiekty .NET.

  • Linq-to-Entities to ten sam pomysł, ale używanie Entity Framework w tle jako ORM - ponownie od firmy Microsoft, ale obsługujące wiele backendów baz danych

  • Linq-to-DataSets to LINQ, ale używanie jest przeciwko "starym" zestawom danych ADO.NET 2.0 - w czasach przed ORMami firmy Microsoft wszystko, co można było zrobić z ADO.NET, to zwracanie DataSets, DataTables itp., A Linq -to-DataSets wysyła zapytanie do tych magazynów danych o dane. W takim przypadku należy zwrócić DataTable lub DataSets (Przestrzeń nazw System.Data) z zaplecza bazy danych, a następnie wysłać zapytanie do tych przy użyciu składni LINQ

marc_s
źródło
1
Gratulacje z okazji 50k, teraz oficjalnie spędziłeś zbyt dużo czasu na StackOverflow. ;)
Aaronaught
1
@Aaronaught: dzięki - i masz absolutną rację! :-) Musisz zostawić po jednym uzależnieniu każdemu mężczyźnie, nie? Proszę?!?!?!
marc_s
1
marc_s, dzięki za tę odpowiedź. Czy możesz coś powiedzieć o wydajności? Z twojej odpowiedzi domyślam się, że Linq-to-Entities jest najbardziej zaawansowana, a zatem prawdopodobnie najbardziej wydajna?
Marcel
2
@Marcel: z mojego przeczucia (bez twardych faktów), powiedziałbym: Linq-to-SQL lub jest najszybszy (tylko jedna warstwa między bazą danych a modelem obiektowym), Linq-to-Dataset blisko sekundy, a Linq-to -Entities jest ostatni, ponieważ Entity Framework zawsze ma dwie warstwy mapowania (a zatem najbardziej złożoność). Ale znowu: tylko przeczucie, brak liczb, które by to
potwierdzały
3
@marc_s Wiem, że to stary post, ale w większości przypadków LINQ to Entities byłby szybszy niż LINQ to Dataset. LINQ to Dataset nie jest tak naprawdę typem, jest to LINQ przez obiekty, których używasz zestawu danych jako obiektu. Ponieważ LINQ ponad obiektami nie wykonuje żadnego kodu SQL, musisz najpierw utworzyć zestaw danych ze źródła SQL, a LINQ dla obiektów nie może pomóc w wykonywaniu żadnych optymalizacji zapytań podczas pobierania danych do zestawu danych. To i zbiory danych są straszne pod względem wydajności, ponieważ wszystkie kolumny są w pudełkach, a wszystkie tego typu zmiany zabijają wydajność.
Robert McKee
38

LINQ to szeroki zestaw technologii opartych na (na przykład) składni rozumienia zapytań, na przykład:

var qry = from x in source.Foo
          where x.SomeProp == "abc"
          select x.Bar;

który jest mapowany przez kompilator na kod:

var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);

i tu zaczyna się prawdziwa magia. Zauważ, że nie powiedzieliśmy, co Footu jest - a kompilatorowi to nie przeszkadza! Tak długo, jak można go rozwiązać jakąś odpowiednią metodę o nazwie Where, która może podjąć lambda, a wynik, który ma jakąś Select metodę, która może przyjąć lambda, jest szczęśliwy.

Rozważmy teraz, że lambda można zestawiać zarówno w metodzie anonimowego (pełnomocnik, na LINQ-zadania, które obejmuje Linq do zestawu danych), lub do ekspresyjnym drzewa (model wykonania reprezentującą lambda modelu obiektowego ).

W przypadku danych w pamięci (zazwyczaj IEnumerable<T>) po prostu wykonuje delegata - dobrze i szybko. Ale w przypadku IQueryable<T>reprezentacji obiektowej wyrażenia (a LambdaExpression<...>) może je rozdzielić i zastosować do dowolnego przykładu „LINQ-to-Something”.

W przypadku baz danych (LINQ-to-SQL, LINQ-to-Entities) może to oznaczać pisanie TSQL, na przykład:

SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1

Ale może to (na przykład w przypadku usług danych ADO.NET) oznaczać pisanie zapytania HTTP.

Wykonanie dobrze napisanego zapytania TSQL, które zwraca niewielką ilość danych, jest szybsze niż ładowanie całej bazy danych przez sieć, a następnie filtrowanie na kliencie. Oba mają jednak idealne scenariusze i po prostu błędne scenariusze.

Celem i zaletą jest umożliwienie używania pojedynczej, sprawdzanej statycznie składni do wykonywania zapytań w szerokim zakresie źródeł danych oraz uczynienia kodu bardziej wyrazistym (na przykład „tradycyjny” kod grupujący dane nie bardzo jasne pod względem tego, co próbuje zrobić - ginie w masie kodu).

Marc Gravell
źródło
Marc, dzięki za ten wgląd. Nie pytałem jednak o tak szczegółowe elementy wewnętrzne. -1 przepraszam, bo nie odpowiada na pytanie.
Marcel
7
Jako ktoś piszący własnego dostawcę LINQ, jest to najlepsza odpowiedź, jaką do tej pory widziałem. Nie zgadzam się co do -1.
Dan Barowy
30

LINQ oznacza zapytanie zintegrowane z językiem. Umożliwia używanie języka zapytań „w stylu SQL” bezpośrednio w C # w celu wyodrębnienia informacji ze źródeł danych.

  • Tym źródłem danych może być baza danych serwera SQL - to jest Linq to SQL
  • To źródło danych może być kontekstem danych obiektów struktury encji - Linq do jednostek .
  • Tym źródłem danych mogą być zbiory danych ADO.net - z Linq do Dataset .

Tym źródłem danych może być również plik XML - Linq na XML .
Lub po prostu klasę Collection prostych obiektów - Linq to Objects .

LINQ opisuje technologię zapytań, reszta nazwy opisuje źródło danych, których dotyczy zapytanie.

Aby uzyskać dodatkowe tło:

Zestawy danych to obiekty ADO.net, w których dane są ładowane z bazy danych do zestawu danych .net, a Linq może służyć do wykonywania zapytań dotyczących tych danych po ich załadowaniu.

Za pomocą Linq to SQL definiujesz klasy .net, które mapują do bazy danych, a Linq-to-SQL zajmuje się ładowaniem danych z bazy danych serwera SQL

I wreszcie struktura Entity to system, w którym można zdefiniować bazę danych i mapowanie obiektów w XML, a następnie użyć Linq do zapytania o dane ładowane przez to mapowanie.

Simon P. Stevens
źródło
3
w rzeczywistości Linq-to-SQL to tylko SQL Server - a nie tylko „dowolna” baza danych SQL.
marc_s
3
@marc_s: Dobre miejsce. Dzięki. Chociaż, jeśli ktoś jest zainteresowany, istnieją zewnętrzni dostawcy Linq do sql dla innych baz danych, jeśli ich potrzebujesz. Zobacz code2code.net/DB_Linq lub Google dla innych. Nie mogę jednak komentować ich jakości.
Simon P Stevens
1
Simon, szczególnie dziękuję za to pomocne 2-wierszowe podsumowanie frameworka Entitiy. +1
Marcel