Самым простым способом является добавление параметров подкачки / сортировки / фильтрации в список аргументов метода и добавление соответствующих операторов запроса LINQ к запросу контекста данных в методе сервиса. Однако в этом случае вы потеряете возможности IQueryable
на стороне клиента. Я имею в виду, что запросы клиента будут поступать только на сервер приложений, но не попадут в базу данных. И вам понадобится слой между DomainContext
и пользовательским интерфейсом: DomainDataSource
вряд ли будет работать.
Представление результатов запроса как IQueryable
с использованием AsQueryable()
не поможет, поскольку деревья выражений будут безоговорочно скомпилированы в код для выполнения ваших операторов LINQ-to-Objects.
Несколько сложнее использовать аргументы, как в первом случае, вместе с написанием собственной оболочки IQueryable
над объектом запроса на стороне клиента. Эта оболочка извлекает параметры из выражений запроса и передает их службе в качестве аргументов метода. Ну, я бы попробовал это, только если бы у меня было достаточно свободного времени.
Другой сложный способ - аналогичные действия на стороне сервера. Можно получить IQueryable
объект, которому передано от клиента дерево выражений в DomainService
. Вам нужно переопределить метод DomainService.Query
. Затем вы сможете извлечь часть выражения запроса, которая относится к подкачке / сортировке, сохранить его в поле и затем применить к запросу базы данных. Однако метод Query
является единым для всех методов в данном DomainService
. Следовательно, вы, вероятно, закончите с методом больших таблиц, который решает, что делать для каждого из методов запроса службы. Излишне говорить, что обслуживание станет очень сложным.
В заключение я настоятельно рекомендую вам первый вариант.