Переключение оператора в скомпилированном запросе возможно? - PullRequest
4 голосов
/ 02 июня 2010

Можно ли вообще использовать что-то вроде оператора switch в скомпилированном запросе для linq to entity / sql? Например, при возврате отсортированных записей из базы данных я бы хотел использовать оператор переключения в одном скомпилированном запросе для сортировки по различным свойствам вместо того, чтобы писать 2 скомпилированных запроса (по возрастанию и по убыванию) для каждого свойства, которое вам может потребоваться сортировать, что может быть до 10 скомпилированных запросов даже для простой сортируемой сетки.

В T-SQL это было бы легко с помощью оператора case, так как я мог бы представить, что такая конструкция поддерживается в большинстве баз данных, так почему бы ее не поддерживать в среде linq / entity.

Любое решение для этого?

1 Ответ

3 голосов
/ 01 ноября 2010

Как указывает kyndigs в своем комментарии, единственное решение - подделать оператор switch с третичным оператором ? ::

        internal static readonly Func<MyEntities, long, MessageSortField, int, int, IQueryable<Model.Message>> MessagesPagedSortedAscQuery =
        CompiledQuery.Compile((MyEntities db, long folderId, MessageSortField sortField, int skip, int take) =>
        (
            sortField == MessageSortField.Date ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.Date).Skip(skip).Take(take) :
            sortField == MessageSortField.Subject ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.Subject).Skip(skip).Take(take) :
            sortField == MessageSortField.From ? db.Messages.Where(e => e.FolderId == folderId).OrderBy(m => m.From).Skip(skip).Take(take) :
            db.Messages.Where(e => e.FolderId == folderId).Skip(skip).Take(take)
        ));
...