it-swarm.com.de

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

Ich arbeite jetzt schon eine ganze Weile mit LINQ. Es bleibt jedoch ein bisschen rätselhaft, was die wirklichen Unterschiede zwischen den erwähnten LINQ-Varianten sind.

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

P.S. Ich weiß, dass es viele Informationsquellen gibt, aber ich suche nach einer Art "Spickzettel", der einen Neuling anweist, wohin er ein bestimmtes Ziel verfolgen soll.

86
Marcel
  • alle von ihnen sind LINQ - Language Integrated Query - also haben sie alle eine Menge Gemeinsamkeiten. Mit all diesen "Dialekten" können Sie Daten aus verschiedenen Quellen abfrageartig auswählen.

  • Linq-to-SQL ist Microsofts erster Versuch eines ORM - Object-Relational Mapper. Es unterstützt nur SQL Server. Es ist eine Zuordnungstechnologie zum Zuordnen von SQL Server-Datenbanktabellen zu .NET-Objekten.

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

  • Linq-to-DataSets ist LINQ, aber die Verwendung ist gegen die "alten" ADO.NET 2.0-DataSets - in den Zeiten vor ORMs von Microsoft war alles, was Sie mit ADO.NET tun konnten, die Rückgabe von DataSets , DataTables usw. und Linq-to-DataSets fragen 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 mit der LINQ-Syntax abfragen

106
marc_s

LINQ ist eine breite Palette von Technologien, die (zum Beispiel) 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;

die vom Compiler in Code abgebildet wird:

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

und hier beginnt die echte Magie. Beachten Sie, dass wir nicht gesagt haben, was Foo ist - und der Compiler kümmert sich nicht darum! Solange einige geeignete Methode mit dem Namen Where aufgelöst werden kann, die ein Lambda annehmen kann, hat das Ergebnis einigeSelect Methode das kann das lambda annehmen, es freut sich.

Stellen Sie sich nun vor, dass das Lambda entweder in einer anonymen Methode (Delegat für LINQ-to-Objects, einschließlich LINQ-to-DataSet) kompiliert werden kann . oder zu einem Ausdrucksbaum (ein Laufzeitmodell, das das Lambda in einem Objektmodell darstellt).

Für speicherinterne Daten (normalerweise IEnumerable<T>), es führt gerade den Delegierten aus - fein und schnell. Aber für IQueryable<T> die Objektdarstellung des Ausdrucks (a LambdaExpression<...>) kann es auseinander ziehen und auf jedes "LINQ-to-Something" -Beispiel anwenden.

Für Datenbanken (LINQ-to-SQL, LINQ-to-Entities) kann dies bedeuten, TSQL zu schreiben, zum Beispiel:

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

Dies kann jedoch (beispielsweise 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 völlig falsche Szenarien.

Das Ziel und der 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 ist dies beispielsweise nicht sehr klar in Bezug auf das, was es zu tun versucht - es ist in der Masse von Code verloren).

36
Marc Gravell

LINQ steht für Language Integrated Query. 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 - das ist Linq to SQL
  • Diese Datenquelle könnte ein Datenkontext von Entity-Framework-Objekten sein - Linq to entity.
  • Diese Datenquelle können ADO.net-Datensätze sein - Linq to Dataset.

Diese Datenquelle kann auch eine XML-Datei sein - Linq to XML.
Oder auch nur eine Collection-Klasse einfacher Objekte - Linq to Objects.

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

Für ein bisschen mehr Hintergrund:

Datasets sind ADO.net-Objekte, bei denen Daten aus einer Datenbank in ein .net-Dataset geladen werden und mit Linq diese Daten nach dem Laden abgefragt werden können.

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.

26
Simon P Stevens