2017-02-17 23 views
1

我有什麼,我認爲將是一個簡單的查詢爭奪......LINQ任何()無法正常運行

模式就像是

Documents(DocumentID,名稱)
Industries (IndustryID,名稱)
Documents_Industries(DocumentID,IndustryID)

數據是像

DOCA - 增長的行業
DocB - 增長的行業,IndustryB
DOCC - 增長的行業,IndustryB
DocD - IndustryB

(所以上面將導致6行中Documents_Industries數據,希望這是自-explanatory)

預期行爲:我試圖顯示一個由用戶選擇的行業篩選的文檔列表。如果選擇IndustryA,則結果集應爲DocA,DocB,DocC。如果選擇IndustryB,結果集應該是DocB,DocC,DocD。 如果選擇IndustryA和IndustryB,則結果集應爲DocB,DocC。

代碼到目前爲止

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))); 
} 

實際行爲:如果選擇了增長的行業和IndustryB,結果集是DOCA,DocB,DOCC,DocD。 DocC,而不僅僅是DocB。我試過了.All(),但那也行不通。我可能做錯了什麼?

+4

所有將更接近,但它會更喜歡'L => SelectedIndustries.All(M => m.Contains(...' – BradleyDotNET

+0

您正在使用多對多,如果選擇IndustryA和IndustryB爲什麼要排除文檔A和文檔B?它們都具有這些行業 – kat1330

+0

@ kat1330,因爲這是要求:)用戶的篩選器比「或」 - 「獲取所有這兩個行業的所有文件」。 – user982119

回答

2

您需要同時使用AllAny這樣的:

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

你擊敗了我幾秒鐘。我只是補充說,只要'industryIdsSelected'不是一個「長」列表,因爲EF必須將列表轉換爲SQL語句中的臨時表(各種)。但我認爲這裏沒問題。 –

+2

您將在檢查生成的SQL時看到。該列表由'n' select + union語句重建。 –

+0

@GertArnold - 好點。基於這個例子,我猜想OP應該沒有問題。 – Aducci