2016-08-04 60 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; 
    }