OData-$ expand中的$ top不会在生成的EF查询中插入“ TOP”

时间:2019-01-08 15:12:17

标签: asp.net entity-framework odata automapper

我正在使用OData + Entity Framework为我的应用程序提供Web服务。 将成员从数据库实体投影到应用程序模型(使用AutoMapper ProjectTo)后,实体框架将打印数千行,而不是限制OData URL中具有$ top属性的行。

[HttpGet]
  [EnableQuery(MaxExpansionDepth = 7, EnsureStableOrdering = false)]
  public virtual SingleResult<TModel> Get([FromODataUri] TKeyType key, ODataQueryOptions<TModel> opts)
  {
     IQueryable<TEntity> data = _db.Set<TEntity>()
        .Where(_db.BuildKeyPredicate<TEntity>(key));

     return SingleResult.Create(GetProjected(opts, data));
  }

private IQueryable<TModel> GetProjected(ODataQueryOptions<TModel> opts, IQueryable data)
  {
     string[] expandedProperties = Helpers.Expand.GetMembersToExpandNames(opts);
     IQueryable<TModel> projected;

     if (expandedProperties.Count() > 0)
     {
        projected = data.ProjectTo<TModel>(null, expandedProperties);
// expandedProperties is an array of string with the names of properties to expand specified in $expand
     }
     else
     {
        projected = data.ProjectTo<TModel>();
     }

     return projected;
  }

示例网址:http://WEBSERVER/odata/Entity(416)?$ expand = Child($ top = 100)

在调试器中,子长度超过100 ...在我的情况下为57k。这就是为什么我使用$ top :) 我以为Entity Framework会自动在OData中使用查询中的TOP关键字转换$ top参数,但这没有发生。

如果您需要更多代码/更多文档,请告诉我!

1 个答案:

答案 0 :(得分:0)

要解决此问题,而不要使用$ expand,您可以使用相关实体路线,如下所示:

http://WEBSERVER/odata/Entity(416)/Child?$top=100

为了使路由有效,您需要在EntityController内部执行GetChild这样的操作:

[EnableQuery]
[ODataRoute("({key})/Child")]
public IQueryable<Child> GetChild([FromODataUri] int key)
{
    return db.Childs.Where(m => m.EntityId == key);
}

有关OData v4相关实体的更多信息,请访问此Entity Relations in OData v4