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,但这似乎不是一个很好的方法

  1. 创建从EnableQueryAttribute继承的类CustomizeAttribute
  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;
    }
    

WebApi 2.0 OData,获取查询中使用的SQL表的列表