2017-02-17 7 views
1

Je suis aux prises avec ce que je pensais être une simple requête ...LINQ Tout() ne fonctionne pas comme prévu

schéma est comme:

Documents (DocumentID, Nom)
Industries (IndustryID, Nom)
Documents_Industries (DocumentID, IndustryID)

données est comme:

Doca - Industrya
DocB - Industrya, IndustryB
CCOP - Industrya, IndustryB
DOCD - IndustryB

(Ainsi, les données ci-dessus se traduira par 6 lignes de Documents_Industries, espérons que soi-même -explanatoire)

Comportement attendu: J'essaie d'afficher une liste de documents, filtrés par le (s) secteur (s) sélectionné (s) par l'utilisateur. Si IndustryA est sélectionné, l'ensemble de résultats doit être DocA, DocB, DocC. Si IndustryB est sélectionné, le jeu de résultats doit être DocB, DocC, DocD. Si IndustryA et IndustryB sont sélectionnés, le jeu de résultats doit être DocB, DocC.

jusqu'à présent code:

IEnumerable<Document> docs = db.Documents.Where(l => l.IsActive == true); 

// industryIdsSelected is an int[] from the user's selection 

if (industryIdsSelected.Length > 0) 
{ 
    docs = docs.Where(l => l.Industries.Any(m => industryIdsSelected.Contains(m.IndustryID))); 
} 

Comportement réel: Si Industrya et IndustryB est sélectionné, le jeu de résultats est Doca, DocB, CSDC, DOCD. Au lieu de simplement DocB, DocC.

J'ai essayé avec .All() mais cela ne fonctionne pas non plus. Que pourrais-je faire de mal?

+4

Tout serait plus proche, mais il serait plus comme 'l => SelectedIndustries.All (m => m.Contains (...' – BradleyDotNET

+0

Vous utilisez beaucoup à beaucoup et si IndustryA et IndustryB est sélectionné pourquoi vous voulez exclure le document A et le document B. Ils ont tous les deux ces industries – kat1330

+0

@ kat1330, parce que c'est l'exigence :) Le filtre de l'utilisateur est plus que OU - "obtenir tous les documents qui ont ces deux industries" – user982119

Répondre

2

Vous devez utiliser à la fois All et Any comme ceci:

docs.Where(l => industryIdsSelected.All(x => l.Industries.Any(m => m.IndustryID == x))); 
+2

Vous me battre de quelques secondes. J'allais ajouter que c'est OK tant que 'industryIdsSelected' n'est pas une liste 'longue', car EF doit convertir la liste en une table temporaire (de toutes sortes) dans l'instruction SQL. Mais je pense que c'est OK ici. –

+2

Vous verrez quand vous inspecterez le SQL généré. La liste est reconstruite par 'n' select + union statements. –

+0

@GertArnold - Bon point. Sur la base de l'exemple, je suppose qu'il ne devrait pas y avoir de problème pour le PO. – Aducci