2013-08-07 48 views
0

我在Visual Studio c#中有一個MVC 3項目。我有一個LINQ to SQL查詢的正常工作,並按照計算器上其他地方上市的例子:LINQ to SQL - 過濾兩個嵌套集合之間的數據集

Comparing two lists using linq to sql

我已經能夠成功地減少我的結果在我的兩個嵌套集合匹配。這是代碼位該訣竅(例如,從上面的鏈接):

var anyDesiredSkills = canidateSkills.Any(c => desiredSkills.Select(ds => ds.SkillId).Contains(c.SkillId)); 

我已經成功地適應這一點,但現在我需要能夠過濾使用多個條件的記錄。我想知道是否有人能夠適應上述情況,以顯示如何包含多個條件?

爲了讓你對我的目標是什麼的一些背景:

  1. 一個搜索頁面,您可以選擇任意數量的聯繫人
  2. 每個聯繫人添加到搜索條件可以/不可以有「角色'分配。如果存在角色,則應將該因素考慮在內。
  3. 根據此動態標準返回結果。

預先感謝任何及所有的幫助:O)

回答

0

這聽起來像你正在尋找的東西,如:

var desiredSkillIds = desiredSkills.Select(_=>_.SkillId).ToList(); 
var matchingContacts = 
    from contact in Contacts 
    where contact.Role == null || desiredRoles.Contains(contact.Role) 
    where contact.Skills.Any(cs=> desiredSkillIds.Contains(cs.SkillId)) 
    select contact; 

還是在基於方法的語法:

var matchingContacts = Contacts 
    .Where(contact => contact.Role == null || desiredRoles.Contains(contactRole)) 
    .Where(contact => contact.Skills.Any(cs => desiredSkillIds.Contains(cs.SkillId))); 
+0

嗨,這是一個很大的幫助,謝謝你!最後一個問題。下面是聯繫人過濾器的實際語句片段。因爲我使用的是嵌套集合,所以我必須構建稍微不同的語法,因此我不確定在哪裏放置||子句例如servicelist.Where(d => d.ContactSelection.Any(h => model.ContactFilter.Select(ds => ds.ContactRole).Contains(h.ContactRole)));我嘗試了各種職位,但總是被Visual Studio標記出來。 –

+0

想通了,我會在下面發表我的答案。再次感謝你的幫助! –

0

下面是我使用的最終代碼:

servicelist = servicelist.Where(

    d => d.ContactSelection.Any(
          h => model.ContactFilter.Select(ds => ds.StaffNumber).Contains(h.StaffNumber) 
           && 
           model.ContactFilter.Select(ds => ds.ContactRole).Contains(h.ContactRole) || model.ContactFilter.Select(ds => ds.StaffNumber).Contains(h.StaffNumber) && model.ContactFilter.Select(ds => ds.ContactRole).Contains("0")) 
          ); 

需要注意的是最後一個過濾器。載有(「0)是值‘ - 選擇角色 - ’這是在向下拉注入的選項。希望這可以幫助其他人!