您好 - 我正在尝试将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
答案 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()