【问题标题】:The LINQ expression node type 'Invoke' is not supported in LINQ to Entities in entity framework实体框架中的 LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”
【发布时间】:2014-12-12 18:09:36
【问题描述】:

谁能帮我解决我的问题。我正在使用下面给出的代码:

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

【问题讨论】:

标签: c# linq entity-framework expression predicate


【解决方案1】:

这个问题可以使用 Joe Albahari 在 LINQKIT 中的 AsExpandable() 方法来解决。他是我看到你正在使用的PredicateBuilder 的创建者。

如果使用实体框架查询,请将最后一行更改为:

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

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

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

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

    • 但是这样做我收到以下错误消息“System.Collections.Generic.IEnumerable”不包含“Where”的定义和最佳扩展方法重载 'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable, System.Func)' 有一些无效参数
    • 在 .AsEnumerable() 之后执行 where 意味着所有记录都将被吸入。请谨慎使用此建议。
    【解决方案3】:

    我有一个案例,您的案例中的“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);
    

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多