誰かが私の問題を解決するのを手伝ってくれる?私は以下のコードを使用しています:
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ではサポートされていません。"}
この問題は、Joe AlbahariによってLINQKITに存在するAsExpandable()メソッドを使用して解決できます。彼はあなたが使用しているのと同じPredicateBuilder
の作成者です。
Entity Frameworkでクエリを実行する場合は、最後の行を次のように変更します。
return objectContext.Products.AsExpandable().Where(predicate);
LINQKIT DLL here を取得するか、NuGetパッケージを介してインストールすることができます here 。
それは私の問題を解決したので、それは確かにあなたの問題を解決します。
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);
}