2015-04-29 11 views
5

Ich habe eine ASP.NET Web API App mit Entity Framework und Odata.Ändern der Odatergebnisse nach Abfrage

Ich mag würde die Ergebnisse einer Abfrage ändern, wenn eine GET ... zur Zeit, in der Steuerung, die Sie sich effektiv passieren nur die EntityFramework Dateneinheiten zurück zu den OData-Handler ...

[EnableQuery] 
public IQueryable<myEntity> GetLineItem() 
{ 
    return db.myEntities; 
} 

es ist einfach zu prepend was query OData in diese gelangt, indem einfach eine Teilmenge

return db.myEntity.Where(myEntity => myEntity.Name == "Bob") 

Rückkehr OData fügt, was im $ Filter zum Ausdruck Abfragezeichen Parameter in hier übergeben und Sie die Teilmenge dieser Ergebnisse.

Allerdings möchte ich über die Ergebnisse iterieren, sobald die Abfrage ausgeführt und die SQL-Ergebnisse in Entitätsobjekte analysiert werden.

Ich habe versucht, einen Wrapper zu erstellen, der die IQueryable-Schnittstelle implementiert und in die GetEnumerator-Methoden und das gleiche für den IProvider einhakt und in die Execute-Methode einhakt. Odata scheint keines davon zu benutzen.

Gibt es eine Möglichkeit, dies zu tun?

Antwort

5

Sie können dies tun, indem Sie einen Filter implementieren. Ein Filter ist einfach ein Attribut, das Sie auf eine Aktion (Controller-Methode), einen Controller (Controller-Klasse) oder ein Register für die gesamte Anwendung anwenden können.

Dieser Filter wird bei einem bestimmten Schritt in der Pipeline angewendet: Es gibt eine Pipeline, die von der eingehenden HTTP-Anforderung zur Controller-Aktion und zurück zur Antwort führt, und Sie können einen Filter an verschiedenen Stellen dieser Pipeline einfügen Ändern Sie die Daten, die durch diese Pipeline fließen.

Sie müssen insbesondere ActionFilterAttribute erben, und führen Sie Ihre Nachbearbeitung auf die OnActionExecuted, die ausgeführt wird, nachdem die Aktion des Controllers ausgeführt wurde.

Docs:

Die letzte Klasse ist der Typ des Parameters der OnActuonExecuted Methode und enthält die Antwort, die Sie ändern können.

Der erste Teil dieses Artikels enthält eine Erklärung für Action-Filter: WEB API 2 USING ACTIONFILTERATTRIBUTE, OVERRIDEACTIONFILTERSATTRIBUTE AND IOC INJECTION

+0

Danke!Ich war mir nicht einmal sicher, wo ich hinschauen sollte. –

0

Sie müssen IQuerable von der Steuerung nicht zurück, wenn sie mit OData arbeiten. Überprüfen Sie unter „Aufrufen von Abfrageoptionen direkt“ am https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options Für Ihren Fall wird es sieht aus wie:

public HttpResponseMessage Get(ODataQueryOptions<myEntity> opts) 
{ 
    var settings = new ODataValidationSettings(); 

    opts.Validate(settings); 

    var intermediateResult = opts.ApplyTo(db.myEntities).ToArray(); 

    var result = //change intermediateResult as you wish. 

    return result; 
} 
0

Aufbauend auf Ihar der answer, hier ist ein vollständiges Beispiel für die Abfrageoptionen anwenden und dann die resultierende Sammlung ändern.

public async Task<IHttpActionResult> Get(ODataQueryOptions<MyModel> options) 
{ 
    var query = _service.Query(); 

    var result = ((IQueryable<MyModel>)options.ApplyTo(query, new ODataQuerySettings())) 
               .ToArray(); 

    foreach (var model in result) 
    { 
     model.SomeNonQueriedValue = "Something else"; 
    } 

    return Ok(result); 
} 
Verwandte Themen