Выражение LINQ node типа 'Invoke' не поддерживается в LINQ to Entities в структуре сущности
может кто-нибудь помочь мне решить мою проблему. Я использую приведенный ниже код:
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 выражение node type 'Invoke' не поддерживается в LINQ to Entities." }
Ответы
Ответ 1
Эта проблема может быть решена с помощью метода AsExpandable(), представленного в LINQKIT Джо Альбахари. Он тот же создатель PredicateBuilder
, что я вижу, что вы используете.
Если запрос с Entity Framework, измените последнюю строку на это:
return objectContext.Products.AsExpandable().Where(predicate);
Вы можете захватить LINQKIT DLL здесь или установить его через пакет NuGet здесь.
Это, безусловно, решит вашу проблему, потому что она решила мою проблему.
Ответ 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);
}
Ответ 3
Попробуйте следующее:
var companyId = oInvoiceHeader.CompanyId;
predicate = predicate.And(o => o.CompanyId == companyId);
Ответ 4
У меня был случай, когда "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);