2011-11-10 2 views
0

Le modèle contient 2 entités avec une relation plusieurs-à-plusieurs: CatalogueItems and Keywords.Entity Framework sélection many-to-many

On suppose que 2 variables sont définies:

ObjectQuery<Keyword> KW; 
ObjectQuery<CatalogueItem> CI; 

KW contient une requête pour sélectionner un ensemble de mots-clés. Je dois obtenir CI qui sélectionne tous les articles de catalogue qui ont au moins un mot-clé de KW.

Une chose importante: rien ne devrait être précalculé ou énuméré. L'énumération des mots-clés prend beaucoup de temps, mais l'interface utilisateur est basée sur l'affichage direct de CatalogItems. Une chose parfaite serait d'obtenir CI prêt pour l'exécution.

Répondre

0

Quelque chose comme ceci:

from catalogueItem in CI 
from keyword in KW 
where catalogueItem.Keywords.Contains(keyword) 
select catalogueItem 

EDIT: Alors que KW ne se calcule pas à chaque fois, essayez de faire ceci:

var keywords = KW.ToList() 
from catalogueItem in CI 
from keyword in keywords 
where catalogueItem.Keywords.Contains(keyword) 
select catalogueItem 

Sinon, je vais besoin de voir la requête dans KW et toute votre base de données pour savoir comment optimiser la requête.

Une autre option consisterait simplement à écrire une procédure stockée et à la mapper avec Entity Framework.

+0

Merci. Cela fonctionne, mais trop lent. Une seule requête pour récupérer des mots-clés prend quelques secondes. Cette requête est en cours d'exécution ... Je ne sais pas. Je me suis perdu pendant 10 minutes et l'ai éteint. On dirait qu'il recalcule KW pour chaque catalogueItem. En outre, CatalogItems sont répétés dans les résultats. Distinct() n'aide pas du tout - l'application se bloque et ne donne aucun résultat dans un délai raisonnable. Je crois qu'il devrait y avoir une manière plus optimisée. – Sergey40a

+0

Voir ma modification s'il vous plaît. – Svarog

+0

La requête est comme "keyword.Value like @ 0 ou keyword.Value like @ 1 ...". La base de données possède une table de transition (ItemID, KeywordID) pour établir une relation many-to-many. Les index sont ok. Peut-être que SP est un meilleur moyen de mettre en œuvre cette ... Dommage – Sergey40a

0
context.CatalogueItems.Where(ci=> ci.Keywords.Where(cik=>KW.Any(cik))); 

Quelque chose comme ça? S'il vous plaît vérifier la syntaxe.

+0

Quelque chose ne va pas :(Il ne comprend pas "cik" dans les parenthèses les plus internes. – Sergey40a