7

Estoy tratando de reutilizar parte de una consulta, porque es lo suficientemente complejo como para intentar evitar la duplicación de código.¿Cómo se pueden reutilizar las consultas de Entity Framework (usando métodos)?

Parece que cuando se llama a cualquier método dentro de una consulta, se termina con:

LINQ a Entidades no reconoce el método Método {X}, y este método no se puede traducir en una expresión tienda

Lo que me gustaría hacer lo ideal es usar:

var q = from item in context.Items 
     where item.SomeCondition == true 
     select new {Item = item, Connections = GetConnections(item)}; 

GetConnections es el método que realiza consultas en item. Estoy intentando reutilizar la consulta (bastante compleja) en GetConnections, pero no estoy seguro de cómo hacer que funcione.

Firma actual de GetConnections es algo así como:

IQuerable<Connection> GetConnections(MyItem item) 

Respuesta

11
Expression<Func<Customer, CustomerWithRecentOrders>> 
    GetCustomerWithRecentOrdersSelector() 
{ 
    return c => new CustomerWithRecentOrders() 
    { 
    Customer = c, 
    RecentOrders = c.Orders.Where(o => o.IsRecent) 
    }; 
} 

Luego, más tarde ...

var selector = GetCustomerWithRecentOrderSelector(); 
var q = myContext.Customers 
    .Where(c => c.SomeCondition) 
    .Select(selector); 
+1

Cualquier idea de cómo hacer lo mismo cuando no tiene un 'IQuerable ' sino simplemente 'Cliente ¿? ¿Es eso posible? –

+0

CustomerWithRecentOrders x = myContext.Customers .Where (c => c == myCustomer) .Select (selector) .Single() –

-1

Su consulta se ve casi perfecto para mí. Sin duda puede llamar al GetConnections(item) desde su consulta; los métodos de llamada son legales. Sin embargo, tiene otro problema: los miembros de tipo anónimo deben crearse con nombres de miembros (sin esos nombres, no tendría forma de acceder a ellos).

la siguiente consulta compila bien para mí:

var q = from item in context.Items 
     where item.SomeCondition == true 
     select new {item = item, connections = GetConnections(item)}; 

Nota la adición de item = y connections = a la select.

Tenga en cuenta, sin embargo, que su método GetConnections() puede necesitar ser static (el mío era; no estaba seguro de si lo dejó de forma accidental o no).

+0

No es la compilación que falla, es la ejecución. No copié/pegué el código, sino que lo escribí por cabeza, es por eso que olvidé los miembros de tipo anónimo –

Cuestiones relacionadas