29 LINQ to SQL
Nachdem wir uns in den vorangegangenen Kapiteln mit dem Datenzugriff mit ADO.NET beschäftigt haben, wollen wir uns nun LINQ to SQL zuwenden. LINQ to SQL vereinfacht das Arbeiten mit Daten, deren Quelle eine relationale Datenbank ist. Derzeit beschränkt sich LINQ to SQL auf den SQL Server, kann also momentan nicht zusammen mit anderen Datenbankservern benutzt werden. Wie Sie noch sehen werden, vereinfachen sich der Zugriff und auch die Manipulation der Daten mit LINQ to SQL im Vergleich mit ADO.NET drastisch, was Ihnen viele Zeilen Code erspart.
29.1 Allgemeine Grundlagen 

Im Vordergrund steht bei LINQ to SQL das sogenannte Object Relational Mapping (ORM). Bekanntermaßen speichert ein Datenbankserver wie der SQL Server die Daten in Tabellen. Beim Object Relational Mapping werden die Tabellendaten von der Datenbank bezogen und in der Clientanwendung einem Objektmodell zugeordnet. Die datenbeschreibenden Objekte können anschließend von der Anwendung beliebig verarbeitet werden.
LINQ to SQL kann nicht nur die empfangenen Daten in Objekte umwandeln. Es hat auch die Fähigkeit, sprachintegrierte LINQ-Abfragen in SQL-Statements zu übersetzen und bei Bedarf die Objekte wieder zurück in relationale Daten zu portieren. Damit ist es möglich, Änderungen, die an den datenbeschreibenden Objekten vorgenommen worden sind, als Aktualisierung in der Datenbank zu speichern.
Im Wesentlichen spielen zwei Komponenten bei LINQ to SQL eine wichtige Rolle:
- die Entitätsklassen
- die Klasse DataContext
Da die relationalen Daten aus einer Datenbank einem Objektmodell zugeordnet werden müssen, muss für jede benötigte Tabelle eine Entitätsklasse geschaffen werden. Eine Instanz der Entitätsklasse beschreibt einen Datensatz und liefert darüber hinaus auch die Metadaten für das LINQ-Abfragemodell. Dazu wird in der Entitätsklasse jede Spalte der Tabelle durch eine Eigenschaft der Entitätsklasse beschrieben. Über ein Attribut werden die Metadaten der Spalte definiert, beispielsweise ob es sich um die Spalte handelt, die den Primärschlüssel der Tabelle beschreibt. Ein anderes Attribut dient der Zuordnung der Klasse zu einer bestimmten Tabelle.
Eine Instanz von DataContext bildet das Herzstück des Programmcodes. Es beschreibt die Verbindung zur Datenquelle und gestattet uns über Methoden den Zugriff auf die gemappten Datensätze, die mit LINQ-Anweisungen gefiltert werden können. DataContext verfolgt auch Änderungen, die an den gemappten Datensätzen vorgenommen werden, und schreibt diese in die Originaldatenbank zurück.