2016-08-04 4 views
0

私はEF5を使用してかなり標準のWebApi 2.0 OData 4.0 Webサービスを持っています。このサービスは機能し、外部キーを使用してエンティティおよび関連するエンティティを照会できます。WebApi 2.0 OData、クエリで使用されるSQLテーブルのリストを取得

サービスは読み取り専用で、コントローラはGetキーとGet-by-keyキーのみを実装しています。両方の取得()の実装では

public class MyTableController : MyDbController 
{ 
    [EnableQuery] 
    public IQueryable<MyTable> Get() 
    { 
     return db.MyTable; 
    } 

    [EnableQuery] 
    public SingleResult<MyTable> Get([FromODataUri] int key) 
    { 
     IQueryable<MyTable> result = db.MyTable.Where(p => p.pk == key); 
     return SingleResult.Create(result); 
    } 
} 

、私はのODataと結果のSQLクエリで使用されているテーブルのリストへのアクセス権を持っていると思います。 MyTableは明らかにその1つですが、他のものを取得するにはどうすればよいですか(他にも、(ネストされた)$拡張で使用されるものの中で)私は自分自身でURLを解析しようとすることができますが、それはそれについて行くための非常に良い方法のようには思われません。

答えて

1
  1. CustomizeAttributeこの方法オーバーライド
  2. EnableQueryAttribute
  3. から継承したクラスを作成します。あなたはこの方法でqueryOptionsを取得し、その後、あなたがSelectExpandQueryOptionに行くとExpandItemを見つけることができます public virtual IQueryable ApplyQuery
  4. を、あなたはすべてを取得表。

    public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions) 
    { 
        if (queryOptions.SelectExpand != null) 
        { 
         foreach (var selectItem in queryOptions.SelectExpand.SelectExpandClause.SelectedItems) 
         { 
          var expandedItem = selectItem as ExpandedNavigationSelectItem; 
          if (expandedItem != null) 
          { 
           // get the entitySetName, tableName 
           string entitySetName = expandedItem.NavigationSource.Name; 
           // can go recursive with expandItem.SelectExpandClause in case we have $epxand=A($expand=B) 
          } 
         } 
        } 
        return base.ApplyQuery(queryable, queryOptions); 
    } 
    
  5. コントローラー法に

    [CustomizeAttribute] 
    public IQueryable<MyTable> Get() 
    { 
        return db.MyTable; 
    } 
    
を、この属性を使用します
関連する問題