实体框架中的LINQ to Entities不支持LINQ表达式节点类型“Invoke”

时间:2012-01-05 11:23:39

标签: c# linq entity-framework expression predicate

任何人都可以帮助我解决我的问题。我使用下面给出的代码:

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'。”}

3 个答案:

答案 0 :(得分:48)

使用Joe Albahari在LINQKIT中提供的AsExpandable()方法可以解决此问题。他是我见过你正在使用的PredicateBuilder的创造者。

  

如果使用Entity Framework进行查询,请将最后一行更改为:

     

return objectContext.Products.AsExpandable().Where(predicate);

您可以获取LINQKIT DLL here或通过NuGet包here安装它。

它肯定会解决你的问题,因为它解决了我的问题。

答案 1 :(得分:2)

Linq to 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);
}

答案 2 :(得分:-2)

我有一个案例,其中&#34; InvoiceHeaders&#34;从你的情况是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);