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

C# 如何在列表中实现嵌套搜索,c#,mvvm,C#,Mvvm,我试图解决一个问题,我需要过滤一个包含自定义引用对象的列表。搜索条件基于嵌套属性。对于参考指南,让我们考虑学生和主题< /代码>类。 public class Student { public String Name {get;set;} public List<Subject> Subjects {get;set;} } public Subject { public String Name {get;set;} } 现在,我还想按科目名称搜索学生,但

我试图解决一个问题,我需要过滤一个包含自定义引用对象的列表。搜索条件基于嵌套属性。对于参考指南,让我们考虑<代码>学生<代码>和<代码>主题< /代码>类。

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

public Subject 
{
    public String Name {get;set;}
}
现在,我还想按科目名称搜索学生,但只想显示匹配结果。一个学生可以选修很多课程,但是“化学”的查询应该只显示正在选修这门课程的学生,而他们正在选修的其他课程应该被忽略


基本上,我的
FilteredList
ListView
绑定,而
主题
列表应该只包含匹配的结果。作为
学生
,我保留原始资料。非常感谢您为实现此搜索提供的任何帮助。

在这种情况下,您可以使用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))

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

在这种情况下,您希望以如下方式使用
选择

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

这会给你想要的结果。

我已经试过了。我想要的是过滤主题。这只会过滤学生。该学生中的所有科目仍将存在。@UsmanKhalid因此,您要返回的是学生与学生姓名筛选器匹配的所有学生,但在这些学生中,仅返回与科目筛选器匹配的科目?是的,但在上次编辑中,似乎只有在学生姓名匹配的地方才会搜索这些科目。假设查询是“数学”,我会让学生学习数学科目吗?@UsmanKhalid是的,在第二个查询中,它将首先匹配名称,然后匹配科目。因此,假设您在“John”中搜索名称,在“Math”中搜索主题,它将返回名称包含“John”的所有学生,并且学生对象将只包含名称包含“Math”的主题。基本上,这是通过两个搜索字符串完成的(一个用于学生姓名,一个用于科目名称)。如果那不是你想要的,就告诉我。
FilteredList = Students.Where(s => s.Name.Contains(studentNameFilter))
    .Select(s => new Student() 
        { 
            Name = s.Name,
            subjects = s.Subjects.Where(sub => sub.Name.Contains(subjectNameFilter))
        });