7

J'essaye de réutiliser une partie d'une requête, parce que c'est assez complexe que je veux essayer d'éviter la duplication de code.Comment les requêtes Entity Framework peuvent-elles être réutilisées (en utilisant des méthodes)?

Il semble que lorsque vous appelez une méthode dans une requête, vous vous retrouvez avec:

LINQ to Entities ne reconnaît pas la méthode de la méthode {X} et cette méthode ne peut pas être traduit en une magasin expression

Ce que je voudrais faire est idéalement utilisation:

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

GetConnections est la méthode qui effectue des requêtes sur item. J'essaye de réutiliser la question (plutôt complexe) dans GetConnections, mais je ne suis pas sûr de savoir comment faire fonctionner ceci.

signature actuelle de GetConnections est quelque chose comme:

IQuerable<Connection> GetConnections(MyItem item) 

Répondre

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

Puis, plus tard ...

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

Une idée comment faire la même chose quand vous n'avez pas un 'IQuerable ' mais juste 'Client '? Est-ce que c'est possible? –

+0

CustomerWithRecentOrders x = myContext.Customers .Where (c => c == myCustomer) .Sélectionnez (sélecteur) .Single() –

-1

Votre requête ressemble presque parfaite pour moi. Vous pouvez très certainement appeler GetConnections(item) depuis votre requête; les méthodes d'appel sont légales. Cependant, vous avez un autre problème: les membres de type anonyme doivent être créés avec des noms de membres (sans ces noms, vous n'auriez aucun moyen d'y accéder).

La requête suivante compile bien pour moi:

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

Notez l'ajout de item = et connections = au select.

Veuillez noter, cependant, que votre méthode GetConnections() peut avoir besoin d'être static (la mienne était, je n'étais pas sûr si vous l'aviez laissé par accident ou non).

+0

Ce n'est pas la compilation qui échoue, il est l'exécution. Je n'ai pas copié/collé le code, mais je l'ai tapé par tête à la place, c'est pourquoi j'ai oublié les membres de type anonyme –

Questions connexes