如何在列表中实现嵌套搜索

时间:2017-04-28 16:05:25

标签: c# mvvm

我正在尝试解决我需要过滤保存自定义引用对象的列表的问题。搜索条件基于嵌套属性。有关参考指南,请考虑StudentSubject类。

public class Student
{
    public String Name {get;set;}
    public List<Subject> Subjects {get;set;}
}

public Subject 
{
    public String Name {get;set;}
}

我不仅想要按名字搜索学生,而且同样的搜索也应该与学科名称一起使用。我有一个字段可以输入文本。对于学生用他们的名字搜索,我已经完成了:

FilteredList = Students.Where(s => s.Name.Contains(searchQuery));

现在,我还希望按主题名称搜索学生,但只想显示匹配的结果。学生可以参加很多课程,但是对“化学”的询问应该只显示正在修读这门课程的学生,但是应该忽略他们正在学习的其他课程。

基本上我的FilteredListListView绑定,Subjects列表应该只包含匹配的结果。我将原始资源保留为Students。任何实施此搜索的帮助都非常感谢。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用LINQ函数Any。这样的东西应该给你缩进的结果:

FilteredList = Students.Where(s => s.Subjects.Any(subs => subs.Name.Contains(subjectSearchQuery))

如果您想同时使用这两个过滤器,可以链接

FilteredList = Students.Where(s => s.Name.Contains(searchQuery))
    .Where(s => s.Subjects.Any(subs => subs.Name.Contains(subjectSearchQuery))

编辑:似乎我理解错误的问题,这就是我认为正确的答案(参见对此答案的评论)

在此,您希望以这样的方式使用Select

FilteredList = Students.Where(s => s.Name.Contains(studentNameFilter))
    .Select(s => new Student() 
        { 
            Name = s.Name,
            subjects = s.Subjects.Where(sub => sub.Name.Contains(subjectNameFilter))
        });

这可以为您提供所需的结果。