Выражение 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);