有人能帮我解决问题吗。我正在使用下面给出的代码:
public IEnumerable<InvoiceHeader> Getdata(Expression<Func<InvoiceHeader, bool>> predicate)
{
return AccountsContext.InvoiceHeaders.Include("Company").Include("Currency")
.Include("BusinessPartnerRoleList").Include("DocumentType")
.Where(predicate);
}
在我的代码中,我使用如下
Expression<Func<InvoiceHeader, bool>> predicate = PredicateBuilder.True<InvoiceHeader>();
predicate = predicate.And(o => o.CompanyId == oInvoiceHeader.CompanyId);
List<InvoiceHeader> lstInvheader=Getdata(predicate).ToList();
通过这样做,我得到了例外。[System.NotSupportedException]---{"LINQ to Entities中不支持LINQ表达式节点类型'Invoke'。"}
这个问题可以使用Joe Albahari在LINQKIT中提供的AsExpandable()方法来解决。他是PredicateBuilder
的创造者,我看到你正在使用。
如果使用实体框架进行查询,请将最后一行更改为:
return objectContext.Products.AsExpandable().Where(predicate);
您可以在此处获取LINQKIT DLL,也可以在此处通过NuGet包进行安装。
它一定能解决你的问题,因为它解决了我的问题。
Linq到EF的查询被转换为SQL。该异常意味着运行时无法将代码转换为SQL查询,因为SQL不支持它。
您可以更改代码以省略SQL不支持的部分,也可以像下面这样首先通过调用.AsEnumerable()从数据库中提取数据,然后您可以执行所有操作,因为它是Linq to Objects
public IEnumerable<InvoiceHeader> Getdata(Expression<Func<InvoiceHeader, bool>> predicate)
{
return AccountsContext.InvoiceHeaders.Include("Company").Include("Currency")
.Include("BusinessPartnerRoleList").Include("DocumentType")
.AsEnumerable()
.Where(predicate);
}
我有一个案例,您的案例中的"InvoiceHeaders"是IEnumerable。添加.AsQueryable()解决了此问题。参考:http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx
所以,代码最后看起来像
return AccountsContext.InvoiceHeaders // omitted includes
.AsQueryable()
.Where(predicate);