Тип узла выражения LINQ 'Invoke' не поддерживается в LINQ to Entities в структуре сущностей - PullRequest
23 голосов
/ 05 января 2012

Может кто-нибудь помочь мне в решении моей проблемы.Я использую код, указанный ниже:

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 to Entities."}

Ответы [ 3 ]

49 голосов
/ 03 июля 2012

Эту проблему можно решить с помощью метода AsExpandable (), представленного в LINQKIT Джо Албахари. Он тот же создатель PredicateBuilder, который, как я вижу, вы используете.

При запросах с Entity Framework измените последнюю строку на эту:

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

Вы можете получить LINQKIT DLL здесь или установить ее через пакет NuGet здесь .

Это, безусловно, решит вашу проблему, потому что решило мою.

2 голосов
/ 05 января 2012

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);
}
0 голосов
/ 12 декабря 2014

У меня был случай, когда "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);
...