web-dev-qa-db-ja.com

LINQ式ノードタイプ「Invoke」は、エンティティフレームワークのLINQ toEntitiesではサポートされていません

誰かが私の問題を解決するのを手伝ってくれる?私は以下のコードを使用しています:

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式ノードタイプ 'Invoke'は、LINQ toEntitiesではサポートされていません。"}

23
zaheer abbas

この問題は、Joe AlbahariによってLINQKITに存在するAsExpandable()メソッドを使用して解決できます。彼はあなたが使用しているのと同じPredicateBuilderの作成者です。

Entity Frameworkでクエリを実行する場合は、最後の行を次のように変更します。

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

LINQKIT DLL here を取得するか、NuGetパッケージを介してインストールすることができます here

それは私の問題を解決したので、それは確かにあなたの問題を解決します。

49

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);
}
2
Yeonho