2016-08-04 59 views
0

我有一個相當標準的WebApi 2.0 OData 4.0 webservice,使用EF5和代碼優先的方法。此服務工作,我可以通過外鍵查詢實體和相關實體。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); 
    } 
} 

在這兩個Get()實現中,我想要訪問在OData中使用的表的列表以及生成的SQL查詢。 MyTable顯然是其中之一,但我如何獲得其他人(其中包括(嵌套)$ expand中使用的其他人)?我可以嘗試自己解析URL,但這似乎不是一個很好的解決方法。

回答

1
  1. 創建一個類CustomizeAttribute從EnableQueryAttribute繼承
  2. 重寫此方法:public virtual IQueryable ApplyQuery
  3. 然後你在這個方法中queryOptions,你可以去SelectExpandQueryOption並找到ExpandItem,那麼你得到的所有表。

    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); 
    } 
    
  4. 使用控制器上的方法此屬性

    [CustomizeAttribute] 
    public IQueryable<MyTable> Get() 
    { 
        return db.MyTable; 
    }