我正在使用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参数,但这没有发生。
如果您需要更多代码/更多文档,请告诉我!
答案 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