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.
Odpowiedzi:
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
źródło
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
Foo
tu jest - a kompilatorowi to nie przeszkadza! Tak długo, jak można go rozwiązać jakąś odpowiednią metodę o nazwieWhere
, 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 przypadkuIQueryable<T>
reprezentacji obiektowej wyrażenia (aLambdaExpression<...>
) 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).
źródło
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ć 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.
źródło