LINQ子集合子选择

LINQ子集合子选择,linq,subquery,Linq,Subquery,您好–我正在尝试获取应用于子集合的where条件。我可以得到返回正确父母的标准。但是,我希望子集合也仅限于标准 在我的示例代码中,我只想要具有“链接”技能的人;而且,我只希望每个人的技能都是相等的“链接”。也就是说,每个人的技能都应该只有“链接” 提前谢谢 List<Skill> skills = new List<Skill>(); skills.Add(new Skill(){SkillName="ASP.NET"}); skills.Add(new Skill(){

您好–我正在尝试获取应用于子集合的where条件。我可以得到返回正确父母的标准。但是,我希望子集合也仅限于标准

在我的示例代码中,我只想要具有“链接”技能的人;而且,我只希望每个人的技能都是相等的“链接”。也就是说,每个人的技能都应该只有“链接”

提前谢谢

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相等。请执行以下操作:

var oResult = (from item in People
                where item.Skills.Count() == 1 &&
                item.Skills.Any(s => s.SkillName == "LINQ")
                select item
    ).ToList();
此查询将不返回任何内容,因为您除了LINQ之外还有其他技能

您可以这样做:

foreach (var person in oResult)
{
    person.Skills.RemoveAll(s => !s.SkillName.Equals("LINQ"));
}
注意:在使用LINQ时,您只过滤数据。要对其进行后期处理,请使用类似于我在上面展示的foreach的方法。

尝试以下方法:

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属性调用Count的实现,可能会导致整个集合被迭代。您可以使用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();

谢谢Leniel-事实上,我需要p2,但我只想要带有技能链接的p2。之前:P2 Skills=ASP.NET,C,LINQ之后:P2 Skills=LINQ对不起,我不清楚。再次感谢你在这方面提供的帮助。我不明白你的问题。因此,您希望筛选出具有LINQ技能的人员,并在排序后删除其他仅为该人员维护LINQ的技能。我说得对吗?是的。这是正确的:删除其他技能,仅为该人员维护LINQ。我将准备解决方案。坐着别动,这一点很有效。谢谢我试着复制一些类似于内部连接的东西。