在Entity Framework中,LINQ表达式节点类型“Invoke”不受支持。

23

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

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] --- {"The LINQ expression node type 'Invoke' is not supported in LINQ to Entities."}


你提到了一个异常,我认为你忘记添加它了。 - THelper
如果我没记错的话,这是由于你可能从互联网上获取的PredicateBuilder的工作方式。请尝试使用此版本:https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/PredicateBuilder.cs - Jb Evain
3个回答

49
这个问题可以使用LINQKIT中的AsExpandable()方法来解决,这是由Joe Albahari创建的。他也是PredicateBuilder的创建者,我看到你正在使用它。
如果使用Entity Framework进行查询,请将最后一行更改为:
return objectContext.Products.AsExpandable().Where(predicate);
您可以通过here获取LINQKIT DLL,或通过NuGet包here进行安装。
这肯定会解决您的问题,因为它已经解决了我的问题。

1

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<ShipNet.Accounting.Entities.InvoiceHeader>'不包含 'Where' 的定义,并且最佳扩展方法重载 'System.Linq.Enumerable.Where<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,int,bool>)' 具有一些无效的参数。 - zaheer abbas
12
在使用.AsEnumerable()后进行筛选(where)意味着将会把所有的记录都读取进来。请极度谨慎地遵循这个建议。 - tymtam

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接