Verfasst von: bletra | 10. Februar 2011

Delegates (Teil 6 von 6): LINQ

In einem datenbankbasierten Projekt mussten wir häufig kompliziertere Abfragen zusammen bauen. Egal, in welcher Programmiersprache, läuft dies normalerweise darauf hinaus, sich entsprechend parametrisierte Strings zusammen zu setzen. Schnell vergisst man eine Klammer, schließt den String nicht oder macht andere Syntaxfehler. Ein automatischer Test zeigt diese zwar direkt auf, aber die Entwicklung ist umständlich, die Fehler schwer zu finden. Mit LINQ (language integrated query) bietet .Net eine an SQL angelehnte Abfragesprache, mit Syntax-Check durch den Compiler. Folgendes Beispiel zeigt eine einfache LINQ-Abfrage:

//Code 1
List members = new List();
members.Add(new Member(30, "Tim"));
members.Add(new Member(5, "Struppi"));
members.Add(new Member(53, "Kapität Haddock"));
members.Add(new Member(60, "Prof. Bienlein"));
IEnumerable oldies = from m in members where m.Age > 50 select m.Name;
foreach(string name in oldies)
  Console.WriteLine(name);

In diesem Artikel möchte ich nun darauf eingehen, wie LINQ funktioniert. Dabei werden wir auf Erweiterungsmethoden und eben Delegates stoßen.

Mit Hilfe des ObjektBrowsers können Sie sich leicht die Definition für where ansehen (F12 funktioniert leider nicht):

//Namespace System.Linq.Enumerable
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

Erweiterungsmethoden wurden mit .Net 3.5 eingeführt. Mit ihnen kann von außen, sozusagen im Nachhinein Funktionalität zu vorhandenen Klassen hinzugefügt werden.
Func ist ein vordefiniertes Delegate (siehe Teil 2 dieser Serie). Noch mehr Hintergrundinformation erhält man mit dem Reflector und Disassembling:

//Code 2
 IEnumerable oldies = members.Where(delegate (Member m) {
        return (m.Age > 50);
    }).Select(delegate (Member m) {
        return m.Name;
    });

Mit Lambda ließe sich dies auch umschreiben in:

//Code 3
 IEnumerable oldies = members.Where(m => m.Age > 50).Select(m => m.Name);

Disassembling liefert hier, wie nicht anders zu erwarten, das in Code 2 aufgeführte Ergebnis. In dieser Schreibweise funktioniert auch ein F12 auf dem markierten Where.

Delegates sind eine Grundtechnologie, die sich gerade hinter vielen „Neuerungen“ von .Net verbirgt und es lohnt sich, sich mit der Technologie intensiv auseinander zu setzen. Dieser letzte Artikel verbindet einige Aspekte, der in anderen Teilen eingeführten Möglichkeiten von Delegates.

Artikelserie im Überblick:

Advertisements

Responses

  1. Delegates (Teil 6 von 6): LINQ UBTBlog is a great posting. You get my vote for Delegates (Teil 6 von 6): LINQ UBTBlog and I will bookmark this blog right now.


Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

Kategorien

%d Bloggern gefällt das: