c# - recorrer - El tipo de nodo de expresión LINQ ''Invocar'' no es compatible con LINQ para Entidades en el marco de la entidad
xdocument c# (3)
Este problema se puede resolver utilizando el método AsExpandable () presente en LINQKIT por Joe Albahari. Es el mismo creador de PredicateBuilder
que veo que estás usando.
Si consulta con Entity Framework, cambie la última línea a esto:
return objectContext.Products.AsExpandable().Where(predicate);
Puede capturar LINQKIT DLL here o instalarlo a través de un paquete de NuGet here .
Ciertamente resolverá tu problema porque ha resuelto el mío.
¿Alguien puede ayudarme a resolver mi problema? Estoy usando el código que figura a continuación:
public IEnumerable<InvoiceHeader> Getdata(Expression<Func<InvoiceHeader, bool>> predicate)
{
return AccountsContext.InvoiceHeaders.Include("Company").Include("Currency")
.Include("BusinessPartnerRoleList").Include("DocumentType")
.Where(predicate);
}
.....
En mi código estoy usando como abajo
Expression<Func<InvoiceHeader, bool>> predicate = PredicateBuilder.True<InvoiceHeader>();
predicate = predicate.And(o => o.CompanyId == oInvoiceHeader.CompanyId);
List<InvoiceHeader> lstInvheader=Getdata(predicate).ToList();
Al hacer esto estoy obteniendo la excepción. [System.NotSupportedException] --- {"El tipo de nodo de expresión LINQ ''Invocar'' no es compatible con LINQ para entidades."}
Las consultas de Linq a EF se traducen a SQL. esa excepción significa que el tiempo de ejecución no puede traducir su código en una consulta SQL porque es algo que no se admite en SQL.
puede cambiar su código para omitir las partes que no admite SQL, o puede extraer datos de la base de datos primero llamando a .AsEnumerable () como a continuación, luego puede hacer todo lo que sea, ya que es 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);
}
Tuve un caso en el que "InvoiceHeaders" de su caso era IEnumerable. Agregar .AsQueryable () solucionó el problema. Referencia: http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx
Por lo tanto, el código al final parecía
return AccountsContext.InvoiceHeaders // omitted includes
.AsQueryable()
.Where(predicate);