Was ist der Unterschied zwischen "LINQ to Entities", "LINQ to SQL" und "LINQ to Dataset"?

91

Ich arbeite jetzt schon eine ganze Weile mit LINQ. Es bleibt jedoch ein Rätsel, welche wirklichen Unterschiede zwischen den genannten Geschmacksrichtungen von LINQ bestehen.

Die erfolgreiche Antwort enthält eine kurze Unterscheidung zwischen ihnen. Was ist das Hauptziel jedes Geschmacks, was ist der Nutzen und gibt es eine Auswirkung auf die Leistung ...

PS Ich weiß, dass es viele Informationsquellen gibt, aber ich suche nach einer Art "Spickzettel", der einen Neuling anweist, wohin er zu einem bestimmten Ziel gehen soll.

Marcel
quelle
2
Siehe auch stackoverflow.com/questions/2438672
Henk Holterman

Antworten:

110
  • Alle von ihnen sind LINQ - Language Integrated Query - daher haben sie alle viele Gemeinsamkeiten. Mit all diesen "Dialekten" können Sie grundsätzlich Daten aus verschiedenen Quellen im Abfragestil auswählen.

  • Linq-to-SQL ist der erste Versuch von Microsoft, einen ORM - Object-Relational Mapper zu erstellen. Es wird nur SQL Server unterstützt. Es ist eine Zuordnungstechnologie zum Zuordnen von SQL Server-Datenbanktabellen zu .NET-Objekten.

  • Linq-to-Entities ist die gleiche Idee, verwendet jedoch Entity Framework im Hintergrund als ORM - ebenfalls von Microsoft, unterstützt jedoch mehrere Datenbank-Backends

  • Linq-to-DataSets ist LINQ, aber die Verwendung widerspricht den ADO.NET 2.0-DataSets im "alten Stil". In der Zeit vor ORMs von Microsoft konnten Sie mit ADO.NET lediglich DataSets, DataTables usw. und Linq zurückgeben -to-DataSets fragt diese Datenspeicher nach Daten ab. In diesem Fall würden Sie also eine DataTable oder DataSets (System.Data-Namespace) aus einem Datenbank-Backend zurückgeben und diese dann mithilfe der LINQ-Syntax abfragen

marc_s
quelle
1
Herzlichen Glückwunsch zu 50.000, Sie haben jetzt offiziell zu viel Zeit mit StackOverflow verbracht. ;)
Aaronaught
1
@Aaronaught: danke - und du hast absolut recht! :-) Muss ich jedem Mann eine Sucht überlassen , nein? Bitte?!?!?!
marc_s
1
marc_s, danke für diese Antwort. Kannst du etwas über die Leistung erzählen? Aus Ihrer Antwort würde ich vermuten, dass Linq-to-Entities am weitesten fortgeschritten und daher wahrscheinlich am leistungsfähigsten ist?
Marcel
2
@Marcel: Aus meinem Bauch heraus (keine harten Fakten) würde ich sagen: Linq-to-SQL oder ist die schnellste (nur eine Schicht zwischen Datenbank und Objektmodell), Linq-to-Dataset eine knappe Sekunde und Linq-to -Entities ist das Letzte, da Entity Framework immer zwei Mapping-Ebenen hat (daher die größte Komplexität). Aber nochmal: nur ein Bauchgefühl, keine Zahlen, die das
belegen
3
@marc_s Ich weiß, dass dies ein alter Beitrag ist, aber LINQ to Entities ist in den meisten Fällen wahrscheinlich schneller als LINQ to Dataset. LINQ to Dataset ist nicht wirklich ein Typ, sondern LINQ über Objekte, für die Sie das Dataset als Objekt verwenden. Da LINQ over-Objekte kein SQL ausführen, müssen Sie zuerst Ihr Dataset aus der SQL-Quelle erstellen. LINQ over-Objekte können Ihnen beim Abrufen der Daten in das Dataset keine Abfrageoptimierungen durchführen. Das und die Datensätze sind in Bezug auf die Leistung schrecklich, da alle Spalten eingerahmt sind und alle diese Typverschiebungen die Leistung beeinträchtigen.
Robert McKee
38

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 Foohier ist - und der Compiler ist das egal! Solange es lösen kann einige genannt geeignete Verfahren , Wheredass 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).

Marc Gravell
quelle
Marc, danke für diesen Einblick. Allerdings habe ich nicht nach so detaillierten Interna gefragt. -1, tut mir leid, weil es die Frage nicht beantwortet.
Marcel
7
Als jemand, der seinen eigenen LINQ-Anbieter schreibt, ist dies die beste Antwort, die ich bisher gesehen habe. Ich bin nicht einverstanden mit dem -1.
Dan Barowy
30

LINQ steht für sprachintegrierte Abfrage. Sie können die Abfragesprache "SQL-Stil" direkt in C # verwenden, um Informationen aus Datenquellen zu extrahieren.

  • Diese Datenquelle könnte eine SQL Server-Datenbank sein - dies ist Linq to SQL
  • Diese Datenquelle kann ein Datenkontext von Entity-Framework-Objekten sein - Linq to Entities .
  • Diese Datenquelle könnten ADO.net-Datensätze sein - Linq to Dataset .

Diese Datenquelle könnte auch eine XML-Datei sein - Linq to XML .
Oder auch nur eine Collection-Klasse von einfachen Objekten - Linq to Objects .

LINQ beschreibt die Abfragetechnologie, der Rest des Namens beschreibt die Quelle der abgefragten Daten.

Für ein bisschen zusätzlichen Hintergrund:

Datensammlungen sind ADO.net Objekte , bei denen Daten aus einer Datenbank in eine .NET - Dataset und Linq verwendet werden können , um Abfrage geladen wird , dass die Daten , nachdem es geladen.

Mit Linq to SQL definieren Sie .net-Klassen, die der Datenbank zugeordnet sind, und Linq-to-SQL übernimmt das Laden der Daten aus der SQL Server-Datenbank

Und schließlich ist das Entity Framework ein System, in dem Sie eine Datenbank- und Objektzuordnung in XML definieren und dann mit Linq die Daten abfragen können, die über diese Zuordnung geladen werden.

Simon P Stevens
quelle
3
Tatsächlich ist Linq-to-SQL nur SQL Server - nicht nur "irgendein" SQL-Datenbank-Backend.
marc_s
3
@marc_s: Guter Ort. Vielen Dank. Wenn jemand interessiert ist, gibt es Linq-to-SQL-Anbieter von Drittanbietern für andere Datenbanken, wenn Sie dies wünschen. Weitere Informationen finden Sie unter code2code.net/DB_Linq oder Google. Ich kann ihre Qualität jedoch nicht kommentieren.
Simon P Stevens
1
Simon, vielen Dank insbesondere für die hilfreiche zweizeilige Zusammenfassung des Entitiy-Frameworks. +1
Marcel