Ich habe einen Web-Service unter Verwendung von aus den WebAPI zur Verfügung gestellt von ASP .NET MVC 4. Ich weiß, dass die Schicht oben auf dem WebAPI arbeitet automatisch behandelt OData-Abfragen (wie $filter
, $top
, $skip
), aber was ist, wenn ich die Filterung selbst übernehmen möchte?ASP .NET MVC 4 WebAPI: Handgriff OData fragt
I don't simply return data from my database, aber ich habe eine andere Schicht, die einige Eigenschaften hinzufügt, einige Konvertierungen etc. Also alle meine Daten abfragen, sie konvertieren und an die WebAPI-Klasse für OData-Filter zurückgeben ist nicht nur gut genug. Es ist natürlich schrecklich langsam und generell eine beschissene Idee.
So gibt es einen Weg zu propagieren die OData Abfrageparameter von meinem WebAPI-Einstiegspunkt zu den Funktionen, die ich aufrufen, um die Daten zu erhalten und zu konvertieren?
Zum Beispiel kann ein GET auf /api/people?$skip=10&$top=10
würde auf dem Server aufrufen:
public IQueryable<Person> get() {
return PersonService.get(SomethingAboutCurrentRequest.CurrentOData);
}
Und in PersonService
:
public IQueryable<Person> getPeople(var ODataQueries) {
IQueryable<ServerSidePerson> serverPeople = from p in dbContext.ServerSidePerson select p;
// Make the OData queries
// Skip
serverPeople = serverPeople.Skip(ODataQueries.Skip);
// Take
serverPeople = serverPeople.Take(ODataQueries.Take);
// And so on
// ...
// Then, convert them
IQueryable<Person> people = Converter.convertPersonList(serverPeople);
return people;
}
Dies ist die vollständigste/richtige Antwort, vielen Dank, ich werde dies in meinen nächsten Projekten verwenden. – frapontillo
Werfen Sie einen Blick auf https://github.com/Roysvork/LinqToQuerystring/, das gibt Ihnen die Möglichkeit, ein IQueryable <> direkt aus einer rohen Odata-Abfragezeichenfolge zu erstellen. –
Danke, das hat mich in die richtige Richtung gelenkt. –