2016-04-26 35 views
-1

ODataコントローラに問題がありますが、他のものと比べて少し珍しいです。それはメモリから完全に作業した最初のものであり、データベースは含まれていません。ODataナビゲーションプロパティ内のオブジェクトを飲み込む

返されるエンティティは次のとおりです。

public class TrdRun { 

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

    public TrdTrade [] Trades { get; set; } 

TrdTradeも、エンティティセット(クエリがデータベースに反するいる場合)です。しかし、この特定のケースでは、実行に関連しているすべての取引を返却したいのですが、データベースに行くことなくこれを行います。

私の問題?次のコード:

[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; 
    } 

正しく実行すると、取引が初期化されますが、WebApiはそれらを飲み込むことにします。

さらにフィルタリングせずにデータを「指定されたとおりに」返すように設定するにはどうすればよいですか?私はAutoExpandAttributeについて知っています(これは避けたいものですが、OData属性でマークされたAPIクラスは必要ありません)。しかし、クエリを有効にしていないので、設定したときに返されるデータが返されると思います。

答えて

1

デフォルトの動作がODataMediaTypeFormatterであるため、メモリ内の内容に関係なく、ナビゲーションプロパティに従わないため、Tradesプロパティの値はシリアル化されません。要求のクエリ文字列に$expandを使用するか、またはクラス定義のTradesプロパティのAutoExpandAttributeを使用してこの動作をオーバーライドできますが、いずれの方法でもコントローラメソッドをEnableQueryAttributeで修飾する必要があります。

あなたはそれのいずれかを実行したくない場合は、次のように、あなたはまだプログラムであなたのサービスの設定でTradesの自動拡張を指定することができます。

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

マイナーな問題を:プログラム的なアプローチでは、場合クライアントが完全なメタデータを要求すると(Acceptヘッダーにodata.metadata=fullなど)、ODataシリアライザはではなく、は自動拡張オブジェクトにフルメタデータを含めます。

関連する問題