Share via


Nachtrag zum BASTA!-Vortrag "LINQ Framework"

Es existiert eine große Kluft zwischen Programm-Logik, die in einer Hochsprache geschrieben wurde und den Daten, mit denen wir arbeiten. Je mehr Daten wir zu verarbeiten haben, umso weiter ist die Entfernung von unserem Programm.

In Hochsprachen wie C# oder VB benutzen wir spezialisierte Datentypen, Objekte, Methodenaufrufe und hochgradig optimierte Compiler, während beim Datenzugriff alles auf ein paar Strings reduziert wird, die die SQL-Abfragen beinhalten. Wir werfen all die Vorteile über Bord, wenn wir sie am nötigsten brauchen.

Als Programmierer in diesem Dilemma müssen wir fit sein in zwei total unterschiedlichen Paradigmen (Syntax von SQL und der bevorzugten Programmiersprache) und zwei unterschiedlichen Typsystemen. Wir konvertieren also ständig Daten zwischen zwei verschiedenen Domänen. Wir sind gezwungen, ständig in zwei verschiedenen Richtungen zu denken. Diese Unstimmigkeit ist Ursache für menschliche Fehler und verschwendete Zeit.

 LINQ0

Ist das ein Angriff auf SQL? Nein, das soll es nicht sein. SQL ist sehr ausdrucksstark, wenn es darum geht, große Mengen von Daten zu filtern, organisieren oder irgendwie aufzubereiten.

Aber wie wäre es, wenn wir diese Ausdrucksstärke von SQL näher an unsere Programm-Logik bringen könnten? Wenn wir diese konzeptuelle Distanz verringern könnten? Und an dieser Stelle kommen wir zu LINQ (Language Intergrated Query). LINQ bringt diese beiden Welten zusammen.

LINQ arbeitet (lokal im Speicher) gegen alles, was IEnumerable implementiert, sowie in Remote-Szenarien gegen das IQueryable Interface. Im ersten Fall werden direkt die Ojekte manipuliert, im letzten wird ein im Speicher abgebildetes Objektmodell in eine Abfragesprache umgesetzt, welche das Ziel verstehen kann (SQL bei LINQ to SQL)

LINQ

Hier noch eine Auflistung der neuen Sprachfeatures, die in LINQ aufgehen. Unten sieht man schön die Extension Methods, in die die Query Expression aufgelöst wird.

LINQ2

Fazit:

Object == Data: LINQ behandelt Daten und Objekte gleich, die riesige Distanz wurde erheblich verringert.

Imperativ --> Deklarativ: Statt dem Compiler Schritt für Schritt zu sagen, wie er etwas tun soll, sagen wir nur noch, was wir am Ende erwarten

Und das funktioniert gegen Objekte, relationale Daten und XML

 

Links und Code-Beispiele:

The LINQ Project
https://msdn2.microsoft.com/en-us/netframework/aa904594.aspx

.NET Language-Integrated Query for XML Data
https://msdn2.microsoft.com/en-us/library/bb308960.aspx

Scott Guthrie's Blog:
https://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
https://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx
https://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx
https://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx
https://weblogs.asp.net/scottgu/archive/2007/07/16/linq-to-sql-part-5-binding-ui-using-the-asp-linqdatasource-control.aspx
https://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx
https://weblogs.asp.net/scottgu/archive/2007/08/23/linq-to-sql-part-7-updating-our-database-using-stored-procedures.aspx
https://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
https://weblogs.asp.net/scottgu/archive/2007/09/07/linq-to-sql-part-9-using-a-custom-linq-expression-with-the-lt-asp-linqdatasource-gt-control.aspx