2010-10-04 79 views
1

我试图想出了使用实体SQL编译的查询和我混得ToList()行此错误:编译实体SQL查询和排序依据

LINQ到实体无法识别方法“系统。 Data.Objects.ObjectQuery`1 [BLL.Company] OrderBy(System.String,System.Data.Objects.ObjectParameter [])'方法,并且此方法不能转换为存储表达式。

这里是我想要的代码:

class param 
{ 
    public string where, orderby; 
    public int skip, take; 

} 

.. 

public class BLL.CompanyManager 
{ 
    private static readonly Func<DbContext, param, IQueryable<CompanyInfo>> companyList; 

    static MyClass() 
    { 
     companyList = CompiledQuery.Compile<DbContext, param, IQueryable<CompanyInfo>>(
         (DbContext db, param p) => 
          db.Companies.Include("Projects") 
          //.Where(p.where) 
          .OrderBy(p.orderby) 
          .Skip(p.skip) 
          .Take(p.take) 
          .Select(row => new CompanyInfo() 
          { 
       ... 
          }) 
        ); 

     public static List<CompanyInfo> CompanyList(..) 
     { 
      ... 
      List<CompanyInfo> list = new List<CompanyInfo>(); 
      using (var db = (DbContext.Instance()) 
      { 
       list.AddRange(companyList(db, params).ToList<CompanyInfo>()); // <== ERROR 
      } 
      return list; 
     } 
    } 
} 

回答

0

像它说,你不能在L2E查询中使用查询生成器方法。这种区别很微妙,因为它们看起来完全相同,但查询构建器和L2E不是同一回事。

+0

这是否意味着我无法编译ObjectQuery查询?还是有办法?我想使用动态排序和分页,而不使用表达式树并对其进行预编译。我不能这样做吗? – dstr 2010-10-05 07:16:48

+1

当然你可以编译'ObjectQuery'。您无法使用查询生成器方法编译表达式。您也无法编译“动态”查询。想想看,这是一个矛盾的条款!编译后的查询只能通过参数而不是语法来改变。 – 2010-10-05 12:32:14