Я реализовал пользовательский IQueryable, который открывается через конечную точку OAPA WebAPI. Структура Get контроллера() является довольно стандартным:
[EnableQuery(
AllowedQueryOptions = AllowedQueryOptions.Count
| AllowedQueryOptions.Filter
| AllowedQueryOptions.OrderBy
| AllowedQueryOptions.Skip
| AllowedQueryOptions.Top)]
[ODataRoute]
public PageResult<Foo> Get(ODataQueryOptions<Foo> queryOptions)
{
var bars = new QueryableData<Foo>(_provider);
var result = ((IQueryable<Foo>)queryOptions
.ApplyTo(bars,
new ODataQuerySettings(new ODataQuerySettings { EnableConstantParameterization = false, EnsureStableOrdering = false }))).ToList();
var count = _provider.Count;
return new PageResult<Foo>(result, null, count);
}
странное поведение я вижу, является то, что OData $ Скип в строке запроса применяется после того, как PageResult возвращается. Например:
- если строка запроса содержит $ топ = 10 & $ пропустить = 10 будет не возвращать никаких результатов.
- если строка запроса содержит? & top = 12 & skip = 10 будет (2) возвращены результаты.
То, что я хочу сделать, - это предотвратить использование рамок (ы) для перехода к моим результатам, поскольку поставщик запросов уже реализует пропуск. Есть ли ODataQuerySettings, которые можно установить для предотвращения этого двойного применения пропусков?
EDIT: При дальнейших исследованиях, когда я удаляю $ count = true из строки запроса, пропустите (и верхнюю) функцию, как ожидалось. Это заставляет меня поверить, что мой подход к реализации $ count = true неверен. Из моих сеансов отладки кажется, что когда $ count = true в параметрах запроса, в запросе есть дерево выражений, примененное к нему дважды, один раз с возвращаемым типом long, а затем снова без выражения countlong wrapping. Я попытался вернуть счет на первый проход, а затем правильно запросить второй проход, но это приводит к отложенному применению выражения пропуска. Кажется, есть что-то очень фундаментальное, что мне здесь не хватает.
Awesome. Спасибо за это. – DarrellNorton