Für die objektorientierte Programmierung ist der Zugriff auf Datenbanken eine Herausforderung, da die traditionellen Datenzugriffs-APIs die Daten nicht als Objekte zur Verfügung stellen. Mit der Version 3.5 des .NET Framework hat Microsoft unter dem Namen LINQ eine "sprachintegrierte" Abfrage (Language-INtegrated Query) zur Verfügung gestellt.
Bei dem bisher üblichen Verfahren für eine Datenbankabfrage in ADO.NET wird typischerweise an eine Datenbank, zu der eine Verbindung aufgebaut ist, eine in SQL formulierte Abfrage übergeben, die von der Datenbank ausgeführt wird, um die angeforderten Daten an die fragende Anwendung auszuliefern. LINQ erlaubt es stattdessen durch entsprechende Spracherweiterungen, eine solche Abfrage direkt in Visual Basic (VB) oder C# zu formulieren. Dabei wird eine Syntax verwendet, die sich zwar an SQL anlehnt, aber für den Zugriff auf ganz unterschiedliche Datenquellen verwendbar ist. Bei einer SQL-Abfrage wird ein entsprechender String wie ein schwerverdaulicher Brocken in eine VB- oder C#-Anwendung gesteckt. Ein Debugging dieser Statements selbst ist nicht möglich. Der Compiler kann auch keine Fehlerprüfung zu den Elementen dieses Statements machen. Ein falscher Buchstabe in einem Feldnamen wird leicht übersehen, ist unter Umstanden aber schwer als Fehlerquelle auszumachen. Dagegen ist eine LINQ-Abfrage ein gleichrangiges Element in einer solchen Anwendung, für das auch alle Bequemlichkeiten der Visual Studio-Entwicklungsumgebung wie IntelliSense-Unterstützung und Debugging zur Verfügung stehen. Eine typische Form einer solchen Abfrage kann in VB .NET beispielsweise wie folgt aussehen:
Private kd As New kundenDataContext
Dim kundenByRegion = From k In kd.kunden _
Order By k.Region _
Group By RegionName = k.Region _
Into RegionaleKunden = Group, Count() _
Order By RegionName
For Each region In kundenByRegion
Console.WriteLine(region.RegionName & _
" (" & region.Count & ")" & vbCrLf)
Next
LINQ ist dafür ausgelegt, den Zugriff auf Daten zu vereinheitlichen und erleichert so auch das Mischen von Daten aus verschiedenen Datenquellen, indem die Barrieren zwischen Objekten und relationalen Daten, zwischen Objekten und XML-Daten und zwischen XML und relationalen Daten wenigstens reduziert werden. Ein gravierender Vorteil liegt zudem darin, dass stets auch die Abfrageergebnisse als streng typisierte Objekte zur Verfügung stehen. Damit eine solche sprachintegrierte Abfrage funktioniert, kommen spezielle LINQ-Anbieter (Provider) zum Einsatz, die eine in VB oder C# formulierte Abfrage automatisch in die Befehle übersetzen, die die angesprochene Datenquelle versteht. Bisher stehen dafür folgende Varianten zur Verfügung:
LINQ to SQL
stellt eine Laufzeitinfrastruktur zur Verfügung, die es erlaubt, relationale Daten als Objekte zu handhaben.
LINQ to DataSet
vereinfacht die Abfrage von Daten, die in DataSet-Objekten zur Verfügung stehen.
LINQ to XML
stellt den Entwicklern XML-Dokumente ähnlich wie das DOM-Modell im Speicher zur Abfrage zur Verfügung, wobei nicht mit XPATH gearbeitet wird, sondern mit funktional ähnlichen Spracherweiterungen in C# oder Visual Basic.
LINQ to Entities
erlaubt die Abfrage von Daten, die mithilfe des ADO.NET Entity Frameworks bereitgestellt werden.
LINQ to Objects
erlaubt die Abfrage von speicherinternen Datenkollektionen und Arrays.
datenbanken
Coole Sache?
codekicker.de braucht deine Hilfe: Like uns und klicke auf den +1-Button!
databasepro
databasepro berichtet alle zwei Monate praxisnah über die Themen, die professionelle Datenbank-Architekten, -Administratoren, Consultants, Anwender und IT-Manager, die sich mit der Auswahl von Technologien, Plattformen, Datenbanken und Entwicklungsumgebungen beschäftigen, Tag für Tag brauchen.