LINQ SubCollection SubSelect

时间:2010-08-25 01:06:30

标签: linq subquery

您好 - 我正在尝试将where条件应用于子集合。我可以得到返回适当父母的标准。但是,我希望子集合也限于标准。

在我的示例代码中,我只希望拥有“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

2 个答案:

答案 0 :(得分:4)

这样做:

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

此查询不会返回任何内容,因为除了LINQ之外,p2(You)还有其他技能。

你可以这样做你想做的事情:

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

注意:使用LINQ时,您只是过滤数据。要发布流程,您可以使用我在上面显示的foreach

答案 1 :(得分: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,因此您需要确保它不为空。上面的查询读取效果更好,但根据调用Skills的{​​{1}}属性的实现,可能会导致整个集合被迭代。您可以使用Count()来确保集合不为空。

Any()