Я делаю веб-сервис с OData + Entity Framework для своего приложения.
После проецирования элементов из сущностей базы данных в модель приложения (с использованием AutoMapper ProjectTo) Entity Framework печатает тысячи строк вместо ограничения строк атрибутом $ top в URL-адресе OData.
[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;
}
пример URL: http://WEBSERVER/odata/Entity(416)?$expand=Child($top=100)
в отладчике, длина ребенка больше 100 ... в моем случае 57k. Вот почему я использую $ top :)
Я думал, что Entity Framework автоматически переводит параметр $ top в OData с ключевым словом TOP в запросе, но этого не происходит.
Если вы хотите больше кода / больше документации, пожалуйста, скажите мне!