Teil 3 von der Blog-Serie zum Thema LINQ Provider.
Bevor Sie hier weiterleisen sollten Teil 1 und Teil 2 gelesen haben.
Nachdem wir im Teil 2 unsere Query<T> Klasse implementiert haben stehen wir nun vor unserem letzten Problem: den eigentlichen Provider für die Datenquelle
Dieser muss:
- die Abfrage in möglichst optimierter Form f. d. Datenquelle entsprechend umwandeln
- das Ergebnis von der Datenquelle in die (Ziel-)Objekte wandeln und retournieren.
Genau dafür haben wir bereits vorab die Idee geboren eine entsprechende Provider-Basisklasse zu erstellen, um später nur noch die die eigentliche Logik - Provider.Execute(…) – umzusetzen zu müssen.
Daher implementieren wir im Provider die Funktionalität um eine Instanz von Query<T> zu bilden und diese zu retournieren (CreateQuery<>()).
Ein nicht generischer Aufruf ist hier im Moment nicht implementiert.
public abstract class QueryProvider : IQueryProvider
{
#region IQueryProvider Members
public IQueryable<T> CreateQuery<T>(Expression expression)
{
return new Query<T>(this, expression);
}
public IQueryable CreateQuery(Expression expression)
{
throw new NotImplementedException();
}
T IQueryProvider.Execute<T>(Expression expression)
{
return (T)this.Execute(expression);
}
object IQueryProvider.Execute(Expression expression)
{
return this.Execute(expression);
}
#endregion
public abstract object Execute(Expression expression);
}
In der Basisklasse erzeugen wir außerdem eine abstrakte Methode “Execute” die unser eigentlicher Provider später implementieren muss.
Die vom IQueryProvider Interface stammenden .Execute<T> Methoden rufen diese auf und reichen das Ergebnis weiter.
Somit haben wir bereits mehr als nur einen Grundstein gelegt und können nun verschiedene Provider on-top umsetzen und abfragen auf beliebige Datenquellen ermöglichen.
public class MyCustomProvider : QueryProvider
{
public override object Execute(Expression expression)
{
//Execute Query, Create return Value(s)
}
}
Im vierten Teil der Serie werden wir uns eine Linq.Abfrage bereit legen und die Execute Methode in unsere konkrete Providerklasse implementieren.
Sie möchten mehr wissen zum Thema? Auf der ADC08 gibt es eine Session von mir: