7

Sto cercando di riutilizzare parte di una query, perché è abbastanza complesso che voglio provare a evitare la duplicazione del codice.Come riutilizzare le query di Entity Framework (utilizzando i metodi)?

Sembra che quando si chiama qualsiasi metodo all'interno di una query, si finisce con:

LINQ to Entities non riconosce il metodo metodo di {X}, e questo metodo non può essere tradotto in un espressione negozio

Quello che vorrei fare è idealmente uso:

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

GetConnections è il metodo che esegue query su item. Sto cercando di riutilizzare la query (piuttosto complessa) in GetConnections, ma non sono sicuro di come farlo funzionare.

Firma corrente di GetConnections è qualcosa di simile:

IQuerable<Connection> GetConnections(MyItem item) 

risposta

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

Poi più tardi ...

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

Qualche idea su come fare la stessa cosa quando non si dispone di un 'IQuerable ' ma solo 'Cliente '? È possibile? –

+0

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

-1

Vostri criteri sembra quasi perfetto per me. Puoi certamente chiamare lo GetConnections(item) dalla tua richiesta; i metodi di chiamata sono legali. Tuttavia, hai un altro problema: i membri di tipo Anonimo devono essere creati con nomi di membri (senza questi nomi, non avresti modo di accedervi).

la seguente query compila bene per me:

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

nota l'aggiunta di item = e connections = al select.

Si prega di notare, tuttavia, che il metodo GetConnections() potrebbe essere necessario static (il mio era, non ero sicuro se lo avessi lasciato accidentalmente o no).

+0

Non è la compilation che non riesce, è l'esecuzione. Non ho copiato/incollato il codice, ma lo ho digitato invece, è per questo che ho dimenticato i membri anonimi del tipo –

Problemi correlati