h1

.NET 3.5 – Neuerungen bei C#3.0 – Teil 7 von 9

Februar 11, 2008

LINQ

LINQ … Language INtegrated Query stellt eine Syntax für Abfragen zur Verfügung, die ähnlich der Syntax für relationale und hierarchische Datenabfragen wie SQL und XQuery ist. Die Abfrage beginnt dabei immer mit dem from Ausdruck und endet entweder mit einem select oder group by Ausdruck.

from c in customers
group c.Name by c.Country

Mit diesen Zeile wird aus der Liste der Customers eine nach Ländern sortierte Liste der Customer-Namen erzeugt. Das gleiche kann man auch mit Hilfe der bereits bekannten Extension-Methods und Lambda Expressions schreiben:

customers.GroupBy(c => c.Country, c => c.Name)

Es wird bei genauer Betrachtung schnell deutlich, dass bei LINQ die in den anderen Teilen besprochenen Neuerungen in .NET 3.5 ihre Anwendung finden. Es sind zum einen die Anonymen Typen notwendig, denn das Ergebnis der LINQ-Abfrage ergibt in der Regel einen neuen anonymen Typ. Weiterhin die Extension Methods, denn der Compiler macht aus der LINQ-Abfrage einen Funktionsaufruf, bei dem wiederum die Lambda-Ausdrücke wiederzufinden sind.

from c in customers  
where c.Name=="Microsoft" 
select c

entspricht:

customers.Where(c => c.Name == "Microsoft");

etwas komplexer:

from c in customers  
where c.Name=="Microsoft" 
select c.Country

entspricht:

customers.
Where(c => c.Name=="Microsoft").
Select(c => c.Country);

oder noch etwas komplexer:

from c in customers  
orderby c.Name, c.Balance descending 
select new {c.Country, c.Name, c.Balance}

entspricht:

customers.
OrderBy(c => c.Name).
ThenByDescending(c => c.Balance).
Select(c => new { c.Name, c.Country, c.Balance })

Weiterhin können auch mehrfache Abfragen kombiniert und verschachtelt werden:

from c in customers 
where c.City == "Dresden" 
from o in c.Orders
where o.OrderDate.Year == 2008
select new { c.Name, o.OrderID, o.Total }

entspricht:

customers.
Where(c => c.City == "Dresden"). 
SelectMany(c =>c.Orders.
Where(o => o.OrderDate.Year == 2008).
Select(o => new { c.Name, o.OrderID, o.Total })

Und noch ein Beispiel mit „into“:

from c in customers  
group c by c.Country  
into g 
select new { Country = g.Key, CustCount = g.Group.Count() }

kann auch so geschrieben werden:

from g in         
    from c in customers     
    group c by c.Country
select new { Country = g.Key, CustCount = g.Group.Count() }

entspricht:

customers. 
GroupBy(c => c.Country). 
Select(g => new { Country = g.Key, CustCount = g.Group.Count()})

Alles in allem ist LINQ wohl die komplexeste Erweiterung in .NET 3.5, da diese auch die meisten der besprochenen in sich vereint. Ich konnte hier also nur ganz kurz und grob auf die Syntax eingehen um einen ersten Start zu dem Thema zu finden. Es ist sicher sinnvoll sich mit LINQ to SQL (Thema O/RM) und mit den verfügbaren Beispielen und HoLs. Weiterhin bieten eine Reihe von Blogs eine Menge an Informationen wie z.B. dieser.

^ Teil 1: Übersicht aller Neuerungen (Einleitung)

< Teil 6: Anonymous Types

> Teil 8: Was geht mit Silverlight

Advertisements

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

%d Bloggern gefällt das: