Запрос RIA Services DomainService с EF Projection, который вызывает метод и по-прежнему позволяет компоновать пейджинг / сортировку - PullRequest
4 голосов
/ 02 декабря 2011

Вот интересная проблема, с которой, я надеюсь, кто-то может помочь.

У меня есть класс DomainService со следующим запросом:

    [Query]
    public IEnumerable<BatchResult> GetBatchResults(int batchId)
    {
        return ObjectContext.BatchQueries
            .Include("BatchTCResults")
            .Include("BatchANFResults")
            .Where(x => x.BatchId == batchId)
            .Where(x => x.BatchTCResults.Any() || x.BatchANFResults.Any())
            .ToArray() // enumerate because projection calls a method that EF will poop it's pants on
            .Select(x => new BatchResult
            {
                BatchQueryId = x.Id,
                Route = x.Routing,
                Account = x.Account,
                Amount = x.Amount,
                CheckNumber = x.CheckNumber,
                Severity = BatchResult.DetermineOverallSeverity(x)
            });
    }

Это работает, НО мне действительно нужен подкачка страниц/ сортировка информации, передаваемой от клиента Silverlight, для применения до выполнения перечисления в строке, вызывающей .ToArray()

На стороне клиента используется элемент управления DomainDataSource Silverlight.

Как этого добиться?

1 Ответ

3 голосов
/ 03 декабря 2011

Самым простым способом является добавление параметров подкачки / сортировки / фильтрации в список аргументов метода и добавление соответствующих операторов запроса LINQ к запросу контекста данных в методе сервиса. Однако в этом случае вы потеряете возможности IQueryable на стороне клиента. Я имею в виду, что запросы клиента будут поступать только на сервер приложений, но не попадут в базу данных. И вам понадобится слой между DomainContext и пользовательским интерфейсом: DomainDataSource вряд ли будет работать.

Представление результатов запроса как IQueryable с использованием AsQueryable() не поможет, поскольку деревья выражений будут безоговорочно скомпилированы в код для выполнения ваших операторов LINQ-to-Objects.

Несколько сложнее использовать аргументы, как в первом случае, вместе с написанием собственной оболочки IQueryable над объектом запроса на стороне клиента. Эта оболочка извлекает параметры из выражений запроса и передает их службе в качестве аргументов метода. Ну, я бы попробовал это, только если бы у меня было достаточно свободного времени.

Другой сложный способ - аналогичные действия на стороне сервера. Можно получить IQueryable объект, которому передано от клиента дерево выражений в DomainService. Вам нужно переопределить метод DomainService.Query. Затем вы сможете извлечь часть выражения запроса, которая относится к подкачке / сортировке, сохранить его в поле и затем применить к запросу базы данных. Однако метод Query является единым для всех методов в данном DomainService. Следовательно, вы, вероятно, закончите с методом больших таблиц, который решает, что делать для каждого из методов запроса службы. Излишне говорить, что обслуживание станет очень сложным.

В заключение я настоятельно рекомендую вам первый вариант.

...