2010-06-02 2 views
4

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

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

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

+1

Существует аналогичный вопрос уже на SO, которые могут помочь: HTTP: // StackOverflow .com/вопросы/936028/LINQ-дело-заявление – kyndigs

ответ

3

Как kyndigs ссылается в своем комментарии, единственным решением является подделкой переключатель заявление с ? : третичного оператора:

 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) 
     ));