LINQ und ADO.NET
Aktualisiert: November 2007
Viele Entwickler von Geschäftsanwendungen verwenden heute mindestens zwei Programmiersprachen: eine allgemeine Programmiersprache für die Geschäftslogik und die Darstellungsebenen (wie beispielsweise Visual C# oder Visual Basic) sowie eine Abfragesprache für die Interaktion mit der Datenbank (z. B. Transact-SQL). Der Entwickler muss also mehrerer Sprachen mächtig sein, um seine Arbeit effektiv erledigen zu können. Außerdem sind dadurch Sprachkonflikte in der Entwicklungsumgebung vorprogrammiert. So ergibt es sich z. B., dass eine Anwendung, die zur Ausführung einer Abfrage von Daten aus einer Datenbank eine Datenzugriffs-API verwendet, die Abfrage als Zeichenfolgenliteral angibt, indem sie Anführungszeichen verwendet. Diese Abfrage ist jedoch für den Compiler nicht lesbar und wird nicht auf Fehler (Syntaxfehler, tatsächliche Existenz der Spalten oder Zeilen, auf die verwiesen wird, usw.) geprüft. Auch der Typ der Abfrageparameter wird nicht geprüft, und es gibt keine IntelliSense-Unterstützung.
In Sprachintegrierte Abfrage (Language-Integrated Query, LINQ) können Entwickler in ihrem Anwendungscode mengenbasierte Abfragen unterbringen, ohne dazu auf eine separate Abfragesprache zurückgreifen zu müssen. Sie können LINQ-Abfragen für die verschiedensten aufzählbaren Datenquellen (also Datenquellen, die die IEnumerable-Schnittstelle implementieren) schreiben, wie Datenstrukturen, XML-Dokumente, SQL-Datenbanken und DataSet-Objekte im Arbeitsspeicher. Auch wenn diese aufzählbaren Datenquellen auf unterschiedliche Art und Weise implementiert sind, weisen sie doch alle dieselben Syntax- und Sprachkonstrukte auf. Da Abfragen direkt in der Programmiersprache formuliert werden können, benötigen Sie keine andere Abfragesprache, mit der Abfragen als Zeichenfolgenliterale eingebettet werden, die vom Compiler weder gelesen noch geprüft werden können. Durch die Integration von Abfragen in die Programmiersprache werden Visual Studio-Programmierer auch in die Lage versetzt, durch Typ- und Syntaxprüfungen während der Kompilierung sowie IntelliSense-Unterstützung produktiver zu arbeiten. Mit diesen Features wird der für die Beseitigung von Abfragefehlern erforderliche Aufwand beträchtlich reduziert.
Es gibt drei separate ADO.NET Sprachintegrierte Abfrage (Language-Integrated Query, LINQ)-Technologien: LINQ to DataSet, LINQ to SQL und LINQ to Entities. LINQ to DataSet bietet vielschichtigere, optimierte Abfragen über das DataSet. LINQ to SQL ermöglicht direkte Abfragen des SQL Server-Datenbankschemas und LINQ to Entities das Abfragen eines Entity Data Model.
Das Übertragen von Daten aus SQL-Tabellen in Objekte im Arbeitsspeicher ist häufig nervenaufreibend und fehleranfällig. Der von LINQ to DataSet und LINQ to SQL implementierte LINQ-Anbieter konvertiert die Quelldaten in IEnumerable-basierte Objektauflistungen. Dem Programmierer werden die Daten stets als IEnumerable-Auflistung angezeigt, gleich ob bei einer Abfrage oder bei einer Aktualisierung. Für das Schreiben von Abfragen für diese Auflistungen steht uneingeschränkte IntelliSense-Unterstützung zur Verfügung.
Das folgende Diagramm enthält eine Übersicht über die ADO.NET LINQ-Technologien im Zusammenhang mit allgemeinen Programmiersprachen und LINQ-fähigen Datenquellen.
Die folgenden Abschnitte enthalten weitere Informationen über LINQ to DataSet, LINQ to SQL und LINQ to Entities.
LINQ to DataSet
Das DataSet-Objekt ist ein Schlüsselelement des nicht verbundenen Programmierungsmodells, auf dem ADO.NET basiert, und ist sehr verbreitet. Mit LINQ to DataSet können Entwickler DataSet mit umfangreicheren Abfragefunktionen versehen und dabei denselben Abfrageformulierungsmechanismus verwenden, der auch für viele andere Datenquellen zur Verfügung steht. Weitere Informationen dazu finden Sie unter LINQ to DataSet.
LINQ to SQL
LINQ to SQL ist ein nützliches Tool für Entwickler, die keine Zuordnung zu einem konzeptionellen Modell benötigen. Mit LINQ to SQL können Sie das LINQ-Programmierungsmodell direkt für das vorhandene Datenbankschema verwenden. LINQ to SQL versetzt Entwickler in die Lage, .NET Framework-Klassen zu generieren, die Daten darstellen. Diese generierten Klassen werden nicht einem Konzeptdatenmodell zugeordnet, sondern die Zuordnung erfolgt direkt zu Datenbanktabellen, Ansichten, gespeicherten Prozeduren und benutzerdefinierten Funktionen.
LINQ to SQL ermöglicht es Entwicklern, Code direkt für das Speicherschema zu schreiben und dabei zusätzlich zu anderen Datenquellen, z. B. XML, dasselbe LINQ-Programmierungsmuster wie bei Auflistungen im Arbeitsspeicher und beim DataSet zu verwenden. Weitere Informationen dazu finden Sie unter LINQ to SQL.
LINQ to Entities
Relationale Datenbanken sind die Grundlage der meisten Anwendungen, die derzeit geschrieben werden. Diese Anwendungen müssen zu einem bestimmten Zeitpunkt mit den in relationaler Form dargestellten Daten interagieren. Datenbankschemas sind nicht immer zum Erstellen von Anwendungen geeignet, und die konzeptionellen Modelle der Anwendung unterscheiden sich von den logischen Modellen der Datenbanken. Entity Data Model ist ein konzeptionelles Datenmodell, das zum Modellieren der Daten einer bestimmten Domäne verwendet werden kann, sodass die Anwendungen mit den Daten als Objekten interagieren können. Weitere Informationen finden Sie unter ADO.NET Entity Framework.
Durch das Entity Data Model werden relationale Daten als Objekte in der .NET-Umgebung verfügbar gemacht. Die Objektebene ist daher ein ideales Ziel für die LINQ-Unterstützung, und Entwickler können Abfragen für die Datenbank in der Sprache formulieren, die zum Erstellen der Geschäftslogik verwendet wird. Diese Fähigkeit wird als LINQ to Entities bezeichnet. Weitere Informationen finden Sie unter LINQ to Entities.