Можно ли изменить DataServiceQuery после его создания? - PullRequest
0 голосов
/ 09 марта 2012

Я создаю пейджер в моем пользовательском интерфейсе, который использует 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 Ответ

1 голос
/ 09 марта 2012

Вы можете управлять деревом выражений в 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).

...