Я использую Breeze с серверной частью веб-API, и я пытаюсь выяснить, как правильно применить полученные параметры запроса OData, а также пытаюсь вернуть inlineCount для данного запроса OData.
Причина, по которой я пытаюсь это сделать, заключается в том, что мне нужно обратиться к другому источнику данных и заполнить некоторые связанные свойства объекта, который я возвращаю (при этом все еще разрешены разбиение по страницам и сортировка).
Вот пример того, что я пытаюсь сделать:
[HttpGet]
public QueryResult Reservations( ODataQueryOptions options ) {
var set = _contextProvider.Context.Reservations.Where(r => r is ScheduledReservation || r is PoolReservation).Include(i => i.ReservationType)
.Include(i => i.Vehicle)
.Include(i => i.Vehicle.VehicleMake)
.Include(i => i.Vehicle.VehicleModel).AsQueryable();
var queryable = Breeze.WebApi.QueryHelper.ApplyQuery(set, options, new ODataQuerySettings { EnableConstantParameterization = true, EnsureStableOrdering = true, HandleNullPropagation = HandleNullPropagationOption.Default });
// Hit other data source here and fill in associated properties on returned entities
return new QueryResult
{
InlineCount = // Would like to get at breeze's execution of this query,
Results = queryable.Cast<Reservation>()
};
}
Как мне вручную применить параметры запроса к моему Queryable, при этом позволяя Breeze выполнять и возвращать inlineCount?
Проблема с тем, что я делаю выше, состоит из трех частей:
1) Это вызывает ошибку, в которой говорится, что Breeze не может создать модель EDM, потому что этот метод действия возвращает QueryResult, а не что-то, что реализует IEnumerable ‹>.
2) Я использую метод ApplyQuery () Breeze вместо ApplyTo () объекта ODataQueryOptions, потому что я также хочу сортировать по вложенным свойствам, которые ApplyTo () еще не позволяет. Я не уверен, переступаю ли я свои границы, копаясь в функциональности Breeze и вручную вызывая метод ApplyQuery ().
3) Я вижу в EF Profiler, что запрос на получение inlineCount выполняется при вызове метода ApplyQuery Breeze. Я обнаружил, что метод ApplyQuery устанавливает inlineCount в объекте ODataQueryOptions как свойство с ключом MS_InlineCount. Таким образом, не похоже, что существует «простой» способ добиться этого (скорее, мне кажется странным вытащить его из массива свойств ODataQueryOptions).
Основная причина, по которой я спрашиваю, заключается в том, что весь этот образ мышления кажется неловким. Я хочу дважды проверить и убедиться, что я не пропустил что-то, что позволило бы мне легко применить запрос OData к моему DbSet и по-прежнему позволять возвращать inlineCount (и при этом обеспечивать правильную разбивку по страницам и сортировку).