Windows Developer

Das unabhängige Magazin für Microsoft-Technologien
Tipps und Tricks rund um .NET und Visual Studio
Individuelle generische Dienstoperationen bei WCF Data Services

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne ".NETversum" ihr Expertenwissen rund um .NET-Tools und WPF mit.

Selbstdefinierte Dienstoperationen bei WCF Data Services können auch generisch sein, indem man den Rückgabetyp als IQueryable<T> definiert. Das bedeutet, dass der Aufruf an die vordefinierten Parameter weitere Standardoperatoren der WCF Data Services (z. B. $filter, $top, $skip, $expand) anhängen kann. Listing 1 zeigt eine selbstdefinierte generische Dienstoperation, die Flug-Entitäten liefert.

Listing 1
// Zusätzliche Dienstoperation
// Aufruf: http://UnserServer/WWWingsDataService.svc/FluegeVonNach?von='Rom'&nach='Berlin'&$skip=10&$top=5
[WebGet]
public IQueryable<de.WWWings.GO_STE.Flug> FluegeVonNach2(string von, string nach)
{
if (string.IsNullOrEmpty(von))
{
throw new ArgumentNullException("von", "von darf nicht leer sein!");
}
if (string.IsNullOrEmpty(nach))
{
throw new ArgumentNullException("nach", "nach darf nicht leer sein!");
}
return (from f in this.CurrentDataSource.Flug where f.Abflugort == von && f.Zielort == nach select f);
}

Diese Dienstoperation kann man nun so aufrufen: http://UnserServer/WWWingsDataService.svc/FluegeVonNach2?von='Rom'&nach='Moskau'&$filter=FreiePlaetze gt 0&$skip=10&$top=5

Das bedeutet: Die Parameterwerte Rom und Moskau werden an die vordefinierten Parameter von und nach gebunden. Darüber hinaus wird ein zusätzlicher Filter (Freie Plätze > 0) angewendet und ein Blättern (Überspringen der ersten 10, Rückgabe der nächsten 5 Entitäten) ausgeführt. Ganz wichtig: Das IQueryable in Verbindung mit einer geeigneten Datenquelle (z. B. ADO.NET Entity Framework) führt die komplette Filterbedingung (also Abflugort, Zielort und freie Plätze) sowie das Blättern (alias Paging) in der Datenbank aus. Bei der Generierung von SQL werden also die in der Dienstoperation vordefinierten Bedingungen mit den zusätzlichen Operationen verbunden.

Eine weitere Option ist übrigens, in den selbstdefinierten Dienstoperationen dynamisches LINQ in Verbindung mit dem ADO.NET Entity Framework zu verwenden. Die folgende Operation:

// Zusätzliche Dienstoperation mit generischem Filter-Parameter
[WebGet]
public int GetCount(string where)
{
return String.IsNullOrEmpty(where) ? CurrentDataSource.Flug.Count() : CurrentDataSource.Flug.Where(where).Count();
}

kann man so aufrufen: http://UnserServer/WWWingsDataService.svc/GetCount?where='it.Abflugort="Rom"'

Dabei ist die Bedingung nun nicht mehr in OData-Syntax (also mit Operatoren eq, gt, ls etc.), sondern in der Entity-SQL-Syntax (normale Operatorenschreibweise, it als Variablenname) zu übersenden. Die Bedingung wird an die Query-Builder-Methode Where() übergeben, die das ADO.NET Entity Framework in der Klasse ObjectSet<T> bereitstellt.

Kommentare

Ihr Kommentar zum Thema

Als Gast kommentieren:

Gastkommentare werden nach redaktioneller Prüfung freigegeben (bitte Policy beachten).

WEITERE TEILE DER SERIE: dotNETversum