Thursday, February 14, 2008

IQueryable und IEnumerable

In diesem Artikel möchte ich den Lesern zwei Interface-Typen vorstellen.
IQueryable und IEnumerable .
Es ist vielleicht besser, wenn ich erst über Expression Trees ein Paar Sätze schreibe.

Zum Beispiel, unten sehen Sie eine typische Funktion, die zwei Werte multipliziert und das Ergebnis zurückliefert:

public int func (int x, int y)
{
return x*y;
}

Wir können aber die Funktion anhand einer delegate und lambda expression wie folgt definieren:

Func<int, int, int> func = (x, y) => x*y;

Wenn wir eine SQL expression durch das Kabel zu anderem SQL Server schicken wollen, ist es sehr sinnvoll, sie in einer Datastrukture zu lagern. Denn es ist viel einfacher ein SQL Statement aus einem Baum zu erzeugen als aus IL Code. So kommen expression trees auf die Bühne und lassen sich sehr einfach in SQL Statement umwandeln.
Wir können jetzt unsere Funktion als expression tree definieren:


using System.Linq.Expressions;

...

Expression<Func<int, int, int>> exp = (x, y) => x*y;

Expression tree kann auch in der Code aufgeführt werden indem man folgende Code ausführt;

int Ergebnis = exp.Compile()(2, 7);


Wenn wir die Deklarationen von IEnumerable und IQueryable angucken, können wir die Frage beantworten, warum LINQ to Objects die Interface IEnumerable verwendet und LINQ to SQL die Interface IQueryable.

public interface IEnumerable
{
IEnumerator GetEnumerator();
}



public interface IQueryable : IEnumerable
{
Type ElementType { get; }
Expression Expression { get; }
IQueryProvider Provider { get; }
}



1 comment:

Anonymous said...

viel gelernt