OData - $ top в $ expand не вставляет "TOP" в сгенерированный EF Query - PullRequest
0 голосов
/ 08 января 2019

Я делаю веб-сервис с 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 в запросе, но этого не происходит.

Если вы хотите больше кода / больше документации, пожалуйста, скажите мне!

1 Ответ

0 голосов
/ 02 марта 2019

Чтобы решить эту проблему, вместо использования $ expand, вы можете использовать Маршрут связанной сущности , например:

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

Чтобы сделать маршрут работ, вам нужно выполнить действие EntityController a GetChild следующим образом:

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

Для получения дополнительной информации о связанных объектах OData v4 посетите страницу Отношения между объектами в OData v4

...