2012-01-05 16 views
22

¿Alguien puede ayudarme a resolver mi problema? Estoy utilizando el código indicado a continuación:El tipo de nodo de expresión LINQ 'Invocar' no es compatible con LINQ para Entidades en el marco de la entidad

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 que estoy utilizando la siguiente

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 que estoy recibiendo la excepción. [System.NotSupportedException] --- {"No se admite el tipo de nodo de expresión LINQ 'Invocar' en LINQ to Entities."}

+0

Usted menciona una excepción. Creo que olvidaste agregarlo. – THelper

+0

Si mal no recuerdo, esto se debe a cómo el PredicateBuilder que probablemente tomó de las obras de Internet. Pruebe con esta versión: https://github.com/jbevain/mono.linq.expressions/blob/master/Mono.Linq.Expressions/PredicateBuilder.cs –

Respuesta

1

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 a la consulta SQL porque es algo que no es compatible con SQL.

puede cambiar su código para omitir las partes que SQL no admite, o puede extraer datos de la base de datos primero llamando a .AsEnumerable() como a continuación, luego puede hacer todo, ya que es Linq-to- objetos

public IEnumerable<InvoiceHeader> Getdata(Expression<Func<InvoiceHeader, bool>> predicate) 
{ 
    return AccountsContext.InvoiceHeaders.Include("Company").Include("Currency") 
     .Include("BusinessPartnerRoleList").Include("DocumentType") 
     .AsEnumerable() 
     .Where(predicate); 
} 
+0

Pero al hacer esto, aparece el siguiente mensaje de error 'System.Collections .Generic.IEnumerable 'no contiene una definición para' Dónde 'y la mejor sobrecarga del método de extensión' System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable , System. Func ) 'tiene algunos argumentos inválidos –

+8

Haciendo un where después de .AsEnumerable() significa que TODOS los registros serán absorbidos. Use este consejo con EXTREMA PRECAUCIÓN. – mayu

-1

Prueba esto:

var companyId = oInvoiceHeader.CompanyId; 
predicate = predicate.And(o => o.CompanyId == companyId); 
+2

¿Funciona para usted o es solo adivinar sin intentar nada? –

48

este problema puede ser resuelto utilizando el método AsExpandable() presente en LINQKIT por Joe Albahari. Él es el mismo creador de PredicateBuilder que veo que estás usando.

Si la consulta con Entity Framework, cambie la última línea a esto:

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

se puede agarrar LINQKIT DLL here o instalarlo a través de un paquete de NuGet here.

Ciertamente resolverá su problema porque ha resuelto el mío.

Cuestiones relacionadas