2010-08-25 26 views
3

你好 - 我試圖讓where條件適用於子集合。我可以得到標準來返回適當的父母。但是,我希望子集合也僅限於標準。LINQ SubCollection SubSelect

在我的示例代碼中,我只希望具有「LINK」技能的人員;另外,我只希望每個人的技能都等於「LINK」。也就是說,每個人只應該擁有「LINK」技能。

在此先感謝。

List<Skill> skills = new List<Skill>(); 
skills.Add(new Skill(){SkillName="ASP.NET"}); 
skills.Add(new Skill(){SkillName="C#"}); 
Person p1 = new Person(){ Name="Me", Skills=skills} ; 

List<Skill> skills2 = new List<Skill>(); 
skills2.Add(new Skill(){SkillName="ASP.NET"}); 
skills2.Add(new Skill(){SkillName="C#"}); 
skills2.Add(new Skill(){SkillName="LINQ"}); 
Person p2 = new Person(){ Name="You", Skills=skills2} ; 

List<Person> People = new List<Person>(); 
People.Add(p1); 
People.Add(p2); 

var oResult = (from item in People 
    from sk in item.Skills 
    where sk.SkillName == "LINQ" 
    select item 
    ).ToList(); 

當我運行這個。我得到P2(正確的),但我想P2的只等於LINQ

回答

4

技能操作:

var oResult = (from item in People 
       where item.Skills.Count() == 1 && 
       item.Skills.Any(s => s.SkillName == "LINQ") 
       select item 
    ).ToList(); 

這個查詢將返回任何操作,因爲P2(你)除了擁有LINQ其他技能。

你可以做你想做的是這樣的:

foreach (var person in oResult) 
{ 
    person.Skills.RemoveAll(s => !s.SkillName.Equals("LINQ")); 
} 

注意:在使用LINQ你只過濾你的數據。要發佈過程,您可以使用上面顯示的foreach之類的內容。

+0

Thanks Leniel - 實際上,我需要p2,但我只想用技能鏈接p2。 012技能= LINQ 對不起,我不清楚。並再次感謝您提供幫助。 – shxo 2010-08-25 01:33:32

+0

我不明白你的問題。所以你想用LINQ技巧過濾掉人員,並且在排序後你想刪除其他維護該人員的LINQ技能。我對嗎? – 2010-08-25 01:38:45

+0

是的。這是正確的:「刪除其他技能只維護該人的LINQ」 – shxo 2010-08-25 01:40:08

0

試試這個:

var oResult = (from item in People 
       where item.Skills != null 
       where item.Skills.Count() > 0 
       where item.Skills.All(s => s.SkillName == "LINQ") 
       select item 
      ).ToList(); 

即使你的例子表明,Skills集合有一個值,你要確保你的代碼不會炸燬如果Skills屬性是null

另外,如果您的列表爲空,則需要確保它不爲空,否則All謂詞將返回true。上述查詢讀得更好,但取決於調用Count()Skills屬性的實現可能導致整個集合被迭代。您可以使用Any()來確保集合不是空的。

var oResult = (from item in People 
       where item.Skills != null 
       where item.Skills.Any() 
       where item.Skills.All(s => s.SkillName == "LINQ") 
       select item 
      ).ToList();