Можно ли изменить 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).