2017-04-10 130 views
0

我需要使用equal而不是Contains。 我有一個名爲selectedDeviceTypeIDs碼的數組我認爲它有兩個代碼{1,2}LINQ等於包含

我需要得到查詢結果,如果設備的標識是完全{1,2},所以我必須更換selectedDeviceTypeIDs selectedDeviceTypeIDs.Contains .equal或類似的東西...

m => m.Devices.Any(w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID) 

if (DeviceTypeIDs != null) 
{ 
    Guid[] selectedDeviceTypeIDs = DeviceTypeIDs.Split(',').Select(Guid.Parse).ToArray(); 
    query = query.Where(j => j.HospitalDepartments.Any(jj => jj.Units.Any(m => m.Devices.Any(w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID))))); 
} 
+0

你爲什麼不使用循環並檢查相等的數據? – Bharat

+0

@Bharat因爲這需要將整個數據集放入內存中,這看起來像是一個實體框架查詢。 – DavidG

+0

我通常測試不等於0的計數,這意味着一切都匹配。同樣使用Where((x,i)=> ....類似於這裏Where((j,i)=>(j.HospitalDepartments!= selectedDeviceTypeIDs [i]))。Count == 0 – jdweng

回答

0

選項1:

如果你關心的項目的順序,用SequenceEqual擴展方法。這將返回false,即使收集有項目,但在不同的順序

m => m.Devices.Any(w => selectedDeviceTypeIDs.SequenceEqual(w.DeviceTypeID) 

選項2:

如果你不關心的順序,使用All擴展方法。如果兩個集合中的項目都是相同的,則這將返回true,而與訂單無關。

m => m.Devices.Any(w => selectedDeviceTypeIDs.All(w.DeviceTypeID.Contains) 
+0

Ranjith V. 非常感謝您的幫助...我試過上面的代碼...它給了我錯誤,因爲w.DeviceTypeID是一個屬性而不是數組,我無法將它與selectedDeviceTypeIDs進行比較,我想我需要得到一個w.DeviceTypeID的列表,然後將它與selectedDeviceTypeIDs進行比較...你能幫我解決它 [img] – Alex

0

使用!。除()。任何()確保m.Devices不包含任何DeviceTypeIDselectedDeviceTypeIDs

query = query.Where(j => j.HospitalDepartments.Any(jj => jj.Units 
.Where(m => !m.Devices.Select(w => w.DeviceTypeID).Except(selectedDeviceTypeIDs).Any()))); 
+0

Dear Innat3, I會非常感謝你的幫助和努力......我實際上已經嘗試過你的代碼,但它不工作......但也許是因爲我們使用了兩次...我相信如果你再次看看代碼,它會工作,再次感謝你 – Alex

+0

Innat3我很抱歉,如果你很忙 – Alex

0

你需要不存在檢查selectedDeviceTypeIDs是否包含每個設備,並且每個設備都包含selectedDeviceTypeIDs。你可以用這個:

query = query 
.Where(j => 
    j.HospitalDepartments.Any(jj => 
     jj.Units.Any(m => 
      m.Devices.All(
       w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID)) 
      && 
      selectedDeviceTypeIDs.All(
       g => m.Devices.Select(d => d.DeviceTypeID).Contains(g)) 
     ) 
    ) 
); 
+0

granit,我編輯了問題,並解決它。謝謝你的幫助和努力:) – Alex

+0

@Alex通過使用我的答案中的代碼和您在更新後的問題中編寫的代碼可以獲得相同的結果嗎? – granit