2010-06-02 29 views
4

是否有可能在编译后的查询中使用像switch语句那样的linq到entities/sql? 例如,当从数据库返回排序记录时,我想在一个编译查询中使用类似switch的语句对不同属性进行排序,而不必为每个可能需要的属性编写2个编译查询(升序为&降序)排序,即使是简单的可排序网格,最多可编译10个查询。编译查询中的switch语句可能吗?

在T-SQL中,使用case语句很容易,因为我会想象大多数数据库都支持这样的构造,所以为什么不在linq/entity框架中支持。

任何解决方案?

+1

有一个类似的问题已经在SO这可以帮助:HTTP://计算器.COM /问题/ 936028/LINQ-case语句 – kyndigs 2010-10-13 11:22:26

回答

3

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