2016-04-26 18 views
-1

Ich habe ein Problem mit einem OData-Controller, der im Vergleich zu den anderen, die ich habe, ein wenig ungewöhnlich ist. Es ist das erste, das vollständig aus dem Speicher arbeitet - keine Datenbank beteiligt.OData schluckt Objekte in Navigationseigenschaft

Die zurück Einheit ist:

public class TrdRun { 

    [Key] 
    public Guid Identity { get; set; } 

    public TrdTrade [] Trades { get; set; } 

TrdTrade ist auch ein Unternehmen Satz (die, wenn Abfragen geht gegen eine Datenbank). Aber in diesem speziellen Fall möchte ich alle mit einem Lauf verknüpften Trades als aktiv zurückgeben, und zwar OHNE zur Datenbank zu gehen.

Mein Problem? Der folgende Code:

[ODataRoute] 
    public IEnumerable<Reflexo.Api.TrdRun> Get(ODataQueryOptions options) { 
     var instances = Repository.TrdInstance.AsEnumerable(); 
     var runs = new List<Reflexo.Api.TrdRun>(); 
     foreach (var instance in instances) { 
      runs.Add(Get(instance.Identifier)); 
     } 
     return runs; 
    } 

richtig konfiguriert läuft die Trades haben initialisiert - aber WebAPI beschließt, sie zu schlucken.

Wie kann man es so konfigurieren, dass die Daten "wie angegeben" ohne weitere Filterung zurückgegeben werden? Ich kenne das AutoExpandAttribute (das ich gerne vermeiden würde - ich möchte nicht, dass die API-Klassen mit OData-Attributen markiert sind), aber ich habe Query nicht aktiviert, daher würde ich erwarten, dass die zurückgegebenen Daten zurückgegeben werden, wenn ich sie einrichte.

Antwort

1

Der Wert der Trades-Eigenschaft wird nicht serialisiert, da das Standardverhalten ODataMediaTypeFormatter den Navigationseigenschaften nicht entspricht, unabhängig davon, was im Speicher vorhanden ist. Sie können dieses Verhalten überschreiben, indem Sie $expand in der Abfragezeichenfolge der Anforderung oder AutoExpandAttribute auf der Trades -Eigenschaft in der Klassendefinition verwenden, aber beide Ansätze erfordern, Ihre Controller-Methode mit EnableQueryAttribute zu dekorieren.

Wenn Sie nicht irgendetwas davon tun mögen, können Sie immer noch programmatisch Auto-Erweiterung von Trades in Ihrer Service-Konfiguration wie folgt an:

// Let builder be an instance of ODataModelBuilder or a derived class. 
builder.EntityType<TrdRun>().CollectionProperty(r => r.Trades).AutoExpand = true; 

Minor Problem: Mit dem programmatischen Ansatz, wenn die Der Client fordert vollständige Metadaten an (z. B. odata.metadata=full im Header Accept), der OData-Serializer nicht enthält vollständige Metadaten in den automatisch expandierten Objekten.

Verwandte Themen