Можно ли изменить DataServiceQuery после его создания?

Я создаю пейджер в моем интерфейсе, который использует DataServiceQuery<MyEntityType> встроенный в другое окно, когда дело доходит до конца его кэшированных результатов. Моя текущая реализация пытается сделать что-то вроде:

query = query.Skip(index*page_size).Take(page_size)

где запрос был ранее определен с использованием динамического запроса LINQ как:

query = Where(queryString, queryValues.ToArray()).Take(page_size)

Это создает исключение NotSupportedException: параметр пропуска запроса не может быть указан после параметра верхнего запроса.

Есть ли способ удалить Take (верхнюю) часть DataServiceQuery, добавить затем Skip(), а затем повторно добавить Take()?

1 ответ

Решение

Вы можете манипулировать деревом выражений в IQueryable (DataServiceQuery реализует IQueryable). Например:

DemoService ctx = new DemoService(new Uri("http://services.odata.org/OData/OData.svc/"));
DataServiceQuery<Product> products = ctx.Products;

DataServiceQuery<Product> q = (DataServiceQuery<Product>)products.Where(p => p.Name == "Bread").Skip(10);
MethodCallExpression skipCall = (MethodCallExpression)q.Expression;
q = (DataServiceQuery<Product>)q.Provider.CreateQuery<Product>(skipCall.Arguments[0]);
Console.WriteLine(q);

Этот код создает запрос с пропуском в конце. Затем он принимает запрос и удаляет из него Пропустить. Обратите внимание, что это "хакерский" в том смысле, что он использует Пропуск последним (прямое приведение к MethodCallExpression).

Другие вопросы по тегам