2009-06-30 14 views
2

J'ai le modèle suivant:Réduire le nombre de requêtes dans EF

Entités:

  • produit (contient des données de base pour produits: prix, etc)
  • Attribute (contient des données pour tous attributs facultatifs possibles)
  • ProductAttribute (Contient des données pour les attributs facultatifs d'un produit, par exemple Couleur, modèle, taille). Types de produit est essentiellement plusieurs à plusieurs relation avec une charge utile (ProductId, AttributeID, Value)

Et ce morceau de code:

private static void ListAttributes(Product p) 
{ 
    p.ProductAttributes.Load(); 
    foreach (var att in p.ProductAttributes) 
    { 
     att.Attribute.load(); 
     Console.WriteLine("\tAttribute Name:{0} - Value {1}", 
      att.Attribute.Name, 
      att.AttributeValue); 
    } 
} 

Ce morceau de code se déclenche une requête pour chaque La méthode att.Attribute.Load() est appelée dans la boucle foreach, seulement pour pouvoir afficher le nom de l'attribut. Je voudrais récupérer l'attribut Attribute.Name avec la requête qui récupère toutes les valeurs d'attribut, c'est-à-dire joindre ProductAttribute et Attribute. Existe-t-il un moyen d'y parvenir selon ma méthode?

Répondre

1

Il semble que vous ayez un wrapper autour de l'EntityObject pour effectuer le chargement de chaque Entité par vous-même.

Si vous souhaitez conserver cette structure. Je pense que ce que vous devez faire est de surcharger la méthode ProductAttributes.Load() pour accepter une énumération ou quelque chose. Ensuite, à l'intérieur de cette méthode Load, vous pouvez effectuer une jointure de requête Linq-to-Entity ou Entity-SQL et inclure les attributs pour vous.

var query = from c in context.Product.Include("Attributes"); 
+0

Je n'ai pas de problème avec p.ProductAttributes.Load(); partie. Cela lancera une requête pour chaque produit, qui est de l'ordre de dizaines. Le problème réside avec le att.Attribute.load(); puisque celui-ci lancera des requêtes sql de l'ordre de 100. En outre, l'utilisation de la propriété att.Attribute.IsLoaded réduit le nombre de requêtes inutiles, mais cela reste sous-optimal. – Gio2k

+0

Eh bien, pour moi, il n'y a aucun moyen de travailler avec la méthode att.Attribute.load(). Parce que c'est un "enfant". Il ne sait pas à propos de ses attributs frères et soeurs. Si vous travaillez avec la méthode de chargement "parent" (p.ProductAttributes.Load()), vous pouvez faire en sorte que cette méthode de chargement remplisse les produits et les attributs dans un seul appel de méthode. –

Questions connexes