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?
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
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. –