Verwenden von LINQ in C#
Aktualisiert: November 2007
Anwendungen nutzen sehr häufig Daten in SQL-Datenbanken oder XML-Dokumenten. Früher mussten Entwickler mindestens eine primäre Programmiersprache wie C# und eine sekundäre Sprache wie SQL oder XQuery beherrschen. Durch die Sprachintegrierte Abfrage (Language-Integrated Query, LINQ) werden Abfragefunktionen direkt in die C#-Sprache eingebunden. Jetzt müssen Sie keine separate Abfragesprache mehr lernen, sondern können Ihre vorhandenen C#-Kenntnisse zusammen mit einigen zusätzlichen Schlüsselwörtern und Konzepten einsetzen, um SQL-Datenbanken, ADO.NET-DataSets, XML-Dokumente und alle .NET-Auflistungsklassen, die die IEnumerable-Schnittstelle implementieren, abzufragen.
Vorteile der Verwendung von LINQ
Vertraute Syntax beim Schreiben von Abfragen
Syntaxfehler- und Typsicherheitsüberprüfung zur Kompilierzeit
Verbesserte Debuggerunterstützung
IntelliSense-Unterstützung
Unterstützung des direkten Arbeitens mit XML-Elementen, im Gegensatz zum Erstellen eines XML-Containerdokuments, wie es beim W3C-Dokumentobjektmodell (DOM) erforderlich ist
Speicherinternes Ändern von XML-Dokumenten, das leistungsstark und doch einfacher zu verwenden ist als XPath oder XQuery
Leistungsstarke Filterungs-, Sortierungs- und Gruppierungsfunktionen
Konsistentes Modell zum Arbeiten mit Daten über verschiedene Arten von Datenquellen und Formate hinweg
Spracherweiterungen in C#, die LINQ unterstützen
Im Folgenden finden Sie einige neue Sprachstrukturen, die zu C# 3.0 hinzugefügt werden, um eine Unterstützung von LINQ bereitzustellen:
Sprachstruktur |
Beschreibung |
---|---|
Abfrageausdrücke |
Eine deklarative Abfragesyntax, mit der Daten in LINQ-kompatiblen Datenquellen abgefragt werden. Weitere Informationen finden Sie unter LINQ-Abfrageausdrücke (C#-Programmierhandbuch) und unter C# 3.0-Features zur Unterstützung von LINQ. |
Implizit typisierte Variablen |
Eine mit dem Modifizierer var angegebene Variable, die es dem Compiler ermöglicht, den Typ der Variablen abzuleiten. Weitere Informationen finden Sie unter Implizit typisierte lokale Variablen (C#-Programmierhandbuch) und unter C# 3.0-Features zur Unterstützung von LINQ. |
Objektinitialisierer |
Ermöglicht die Initialisierung von Objekten ohne expliziten Aufruf eines Konstruktors für das Objekt. Weitere Informationen finden Sie unter Objekt- und Auflistungsinitialisierer (C#-Programmierhandbuch) und unter C# 3.0-Features zur Unterstützung von LINQ. |
Anonyme Typen |
Ermöglichen dem Compiler die Erstellung von Objekten ohne Angabe eines benannten Datentyps. Der Typname steht nur dem Compiler zur Verfügung. Weitere Informationen finden Sie unter Anonyme Typen (C#-Programmierhandbuch) und unter C# 3.0-Features zur Unterstützung von LINQ. |
Erweiterungsmethoden |
Ermöglichen die Erweiterung eines vorhandenen Typs durch Zuordnung statischer Methoden zum Typ. Weitere Informationen finden Sie unter C# 3.0-Features zur Unterstützung von LINQ. |
Lambda-Ausdrücke |
Ein Inlineausdruck oder Anweisungsblock, der immer dort verwendet werden kann, wo ein Delegattyp erwartet wird. Weitere Informationen finden Sie unter Lambda-Ausdrücke (C#-Programmierhandbuch) und unter C# 3.0-Features zur Unterstützung von LINQ. |
Schreiben von LINQ-Abfragen
Die grundlegende Struktur eines LINQ-Abfrageausdrucks ist immer gleich, unabhängig davon, ob Sie mit ADO.NET-DataSets, SQL-Datenbanken, .NET-Auflistungen oder XML-Dokumenten arbeiten. Ein Abfrageausdruck beginnt mit einer from-Klausel, gefolgt von Abfrageklauseln wie where, orderby und select. Der vollständige Ausdruck wird in einer Abfragevariablen gespeichert, die beliebig oft ausgeführt oder geändert werden kann. Die Syntax von Abfrageausdrücken ähnelt der Syntax von SQL. So können Sie beispielsweise eine LINQ-Abfrage schreiben, durch die alle Schüler in einer students-Datenbank mit dem Hauptfach science zurückgegeben werden. Verwenden Sie hierfür folgende Syntax:
IEnumerable<Student> studentQuery =
from student in studentApp.students
where student.Major == "Science"
select student;
Weitere Informationen zu Abfrageausdrücken finden Sie unter Grundlegende Abfrageoperationen (LINQ), unter Einführung in LINQ-Abfragen und unter Exemplarische Vorgehensweise: Schreiben von Abfragen in C# (LINQ).
LINQ to Objects
LINQ-zu-Objekten bezieht sich auf die Verwendung von LINQ zum Abfragen von Datenauflistungen im Speicher wie den Klassen in System.Collections und System.Collections.Generic-Namespaces. Zu diesen Klassen gehören unter anderem ArrayList, List<T> und Dictionary<K,T>. Sie können Arrays abfragen, da sie IEnumerable<T> implizit unterstützen. Weitere Informationen finden Sie unter LINQ to Objects.
Sie können sogar eine Textdatei in aufzählbare Datenstrukturen importieren und den Inhalt mithilfe von Abfragen filtern oder sortieren. Ein Beispiel finden Sie unter Gewusst wie: Zählen der Vorkommen eines Worts in einer Zeichenfolge (LINQ).
LINQ to SQL
Greifen Sie mit LINQ to SQL über eine stark typisierte Objektschicht, die Sie mit dem O/R-Designer erstellen, auf SQL Server- und SQL Server Express-Datenbanken zu.
Mit dem O/R-Designer können Sie LINQ to SQL-Klassen Tabellen in einer Datenbank zuordnen und anschließend LINQ-Abfragen schreiben, um Daten an Steuerelemente in Ihrer Anwendung zu binden. So bindet beispielsweise die folgende LINQ-Abfrage die Ergebnisse einer LINQ-Abfrage (alle Kunden aus den USA) an die Bindungsquelle eines DataGridView-Steuerelements.
var CustomersQuery = from customers in northwindSampleDataContext1.Customers
where customers.Country == "US"
select customers;
customerBindingSource.DataSource = CustomersQuery;
Weitere Informationen finden Sie unter LINQ to SQL, unter Übersicht über den O/R-Designer, unter Exemplarische Vorgehensweise: Erstellen von LINQ to SQL-Klassen (O/R-Designer) und unter Gewusst wie: Hinzufügen von LINQ to SQL-Klassen zu einem Projekt (O/R-Designer).
Hinweis: |
---|
O/R-Designer unterstützt derzeit keine SQL Server Compact 3.5-Datenbanken. Informationen zum Erhalt der SQL Server Express Edition finden Sie unter Gewusst wie: Installieren von Beispieldatenbanken im Abschnitt zum Abrufen von SQL Server Express Edition. |
LINQ to DataSet
Daten werden in einer Anwendung mithilfe von DataSet an Steuerelemente gebunden. Anstelle einer direkten Verbindung mit der Datenbank kann die Anwendung bei DataSet Offline-Daten im Cache oder Teilmengen verschiedener Datenquellen verwenden. Wenn die Anwendung in den Onlinemodus wechselt, kann die Datenbank mit den in DataSet vorgenommenen Änderungen aktualisiert werden.
Mit LINQ-zu-DataSet verlaufen Abfragen über zwischengespeicherte Daten schneller und einfacher als mit den Filter- und Sortierfunktionen, die für ein DataSet verfügbar sind. Weitere Informationen finden Sie unter LINQ to DataSet.
LINQ to XML
Mit LINQ to XML können Sie XML-Dokumente schnell und einfach erstellen und bearbeiten, indem Sie LINQ-Abfrageausdrücke anstelle von XPath oder XQuery verwenden. LINQ to XML ist eine neue speicherresidente XML-Programmier-API, die anstelle des W3C-Dokumentobjektmodells (DOM) moderne Programmierkonstrukte verwendet. Weitere Informationen finden Sie unter Unterschiede zwischen LINQ to XML und DOM, unter LINQ to XML und unter Übersicht über die LINQ to XML-Klassen.