LINQ ist eine breite Palette von Technologien, die beispielsweise auf einer Syntax für das Abfrageverständnis basieren, zum Beispiel:
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
welches vom Compiler in Code abgebildet wird:
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
und hier beginnt die wahre Magie. Beachten Sie, dass wir nicht gesagt haben, was Foo
hier ist - und der Compiler ist das egal! Solange es lösen kann einige genannt geeignete Verfahren , Where
dass eine Lambda nehmen, und das Ergebnis davon hat eine Select
Methode, die das Lambda akzeptieren kann, ist es glücklich.
Stellen Sie sich nun vor, dass das Lambda entweder in eine anonyme Methode (Delegat für LINQ-to-Objects, einschließlich LINQ-to-DataSet) oder in einen Ausdrucksbaum (ein Laufzeitmodell, das das Lambda in einem Objektmodell darstellt ) kompiliert werden kann ).
Bei speicherinternen Daten wird (normalerweise IEnumerable<T>
) nur der Delegat ausgeführt - gut und schnell. Für IQueryable<T>
die Objektdarstellung des Ausdrucks (a LambdaExpression<...>
) kann er jedoch auseinandergezogen und auf ein beliebiges "LINQ-to-Something" -Beispiel angewendet werden.
Für Datenbanken (LINQ-to-SQL, LINQ-to-Entities) kann dies das Schreiben von TSQL bedeuten, zum Beispiel:
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
Dies kann jedoch (z. B. für ADO.NET Data Services) das Schreiben einer HTTP-Abfrage bedeuten.
Das Ausführen einer gut geschriebenen TSQL-Abfrage, die eine kleine Datenmenge zurückgibt, ist schneller als das Laden einer gesamten Datenbank über das Netzwerk und das anschließende Filtern auf dem Client. Beide haben jedoch ideale Szenarien und einfach falsche Szenarien.
Ziel und Vorteil besteht darin, dass Sie eine einzige statisch überprüfte Syntax verwenden können, um eine Vielzahl von Datenquellen abzufragen und den Code aussagekräftiger zu gestalten ("traditioneller" Code zum Gruppieren von Daten beispielsweise nicht sehr klar in Bezug auf das, was es zu tun versucht - es geht in der Masse des Codes verloren).