Применение параметров запроса OData вручную с помощью Breeze и возврат InlineCount

Я использую 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 (и при этом обеспечивать правильную разбивку по страницам и сортировку).


person Anthony    schedule 09.09.2013    source источник


Ответы (1)


В конце концов я наткнулся на решение этой проблемы. Следующий пост - это то, что привело меня к правильному решению проблемы, которую я описал выше.

Breeze WebAPI: как объединить QueryResult с ODataQueryOptions, чтобы return inlineCount

person Anthony    schedule 17.10.2013