2016-04-19 5 views
-1

Ich habe ein ungewöhnliches Bedürfnis, dass ich in der Lage sein muss, Objekte zu erweitern, aber ich kann das nicht mit Standard IQUeryable tun.

Ich verwende EntityFramework und AutoMapper, um von Datenbank-Entitäten zu API-Datenobjekten zu projizieren, die ich dann über OData verfügbar mache. Dies hat das Problem, dass es begrenzt, was ich tun kann - zu den Elementen, die AutoMapper ProjectTo kann.

Dies ist im Allgemeinen kein Problem - wenn die Elemente im Api-Objekt Teil der Datenbank sind. Ich habe jetzt bestimmte Objekte, bei denen ich (manchmal optional) Daten hinzufügen muss, die aus anderen Quellen stammen. Wir sprechen im Allgemeinen über Daten, die nur im Speicher gehalten werden (wie die Fehlerdetails eines Objekts, zu denen die Stack-Ablaufverfolgung oder einige Laufzeitstatistiken gehören).

Als solche muss ich einen Weg finden, Abfragen zu manipulieren (und zu filtern) - und noch wichtiger - $ expand in einzelnen Entity GET-Operationen zu behandeln (obwohl Unterstützung für Multi-Get auch willkommen ist, aber da kann ich möglicherweise umgehen dies mithilfe von ODataQueryDetails).

Für einzelne Abfragen Artikel, aber ich habe eine Controller-Methode in Form wie:

Get ([FromODataUri] Guid key) {

, die mir keinen Zugang zu der ODataQueryDetails gibt überhaupt. Weiß jemand, wie man diese Abfragedetails in diesem Fall bekommt?

Dokumentation im Großen und Ganzen "Anpassen der Abfrage" -Element ist nicht besonders groß - und im Allgemeinen scheint zu vermuten, jemand ist "nur mit einigen IQueryable Schnittstelle spielen" - nicht zu berücksichtigen, dass Sie eine mehrstufige Verarbeitung benötigen oder etwas tun das mischt Speicher- und Datenbankdaten.

Hinweis: Web API OData: How do you $expand on a single entity? ist kein Duplikat - das war ein einziges Problem mit einem Parameternamen (Schlüssel als Name erforderlich) und geht nicht tief genug.

+0

Fragen Sie, wie Sie eine Instanz von ['ODataQueryOptions'] erhalten (https://msdn.microsoft.com/en-us/library/system.web.odata.query.odataqueryoptions (v = vs.118) .aspx) an Ihre Controller-Methode übergeben? – lencharest

+0

Das wäre eine mögliche Lösung, ja. – TomTom

Antwort

1

Wenn Sie einfach wie folgt einen Parameter zu Get hinzufügen, liefert die Web-API-Parameterbindung der Methode einen Wert. Lassen Sie Thing der Entitätstyp sein, der von der Steuerung behandelt wird.

public IHttpActionResult Get([FromODataUri] Guid key, ODataQueryOptions<Thing> opts) 

Beachten Sie, dass die generische Version von ODataQueryOptions angeben müssen, oder Sie werden eine Exception.

Dadurch erhalten Sie ein Objekt, das die Abfrageoptionen für die aktuelle Anfrage darstellt, aber Sie können die Optionen nicht ändern (keine der interessanten Eigenschaften hat öffentliche Setter). Es scheint eine große Nachfrage nach Entwicklern zu bestehen, Abfrageoptionen abzufangen und zu modifizieren, aber im Moment gibt es keine Standardlösung. Sehen Sie sich die open issue on Github an, die derzeit auf die Version 5.1.0 abzielt. Aktuelle Empfehlungen zum Ändern von Abfrageoptionen in einer Controller-Methode finden Sie unter OData V4 modify $filter on server side.

+0

Sie haben es verstanden. Der schwierige Teil, bei dem ich versagte, ist die kleine Notiz, die Sie gegeben haben: "Beachten Sie, dass Sie die generische Version von ODataQueryOptions angeben müssen oder Sie eine Ausnahme erhalten." ... die ich nie ausprobiert habe;) Ich hielt mich an die nicht-generischen Formular und fehlende Dokumentation printy blieb stecken .. – TomTom