WebApi 2.0 OData,获取查询中使用的SQL表的列表
本文关键字:SQL 列表 查询 OData 获取 WebApi | 更新日期: 2023-09-27 18:00:13
我有一个相当标准的WebApi 2.0 OData 4.0 Web服务,使用EF5和代码优先的方法。该服务有效,我可以通过外键查询实体和相关实体。
该服务是只读的,控制器只实现了Get和Get-by键。
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,但这似乎不是一个很好的方法
- 创建从EnableQueryAttribute继承的类CustomizeAttribute
- 覆盖此方法:
public virtual IQueryable ApplyQuery
然后你在这个方法中得到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); }
在控制器方法上使用此属性
[CustomizeAttribute] public IQueryable<MyTable> Get() { return db.MyTable; }