Fluent LINQ - 选择包含子列表的父列表,其中存在子集的子集

作者:编程家 分类: sqlserver 时间:2025-09-29

使用Fluent LINQ选择包含子列表的父列表,其中存在子集的子集

在实际开发中,我们经常会遇到需要选择包含特定子列表的父列表的情况。而有时候,我们还需要进一步筛选出那些包含子集的子集的父列表。这时候,Fluent LINQ可以帮助我们轻松地实现这一需求。

假设我们有一个包含学生和课程的数据集合。每个学生都有一组已选课程,而每个课程又有一组已选学生。我们的目标是选择那些包含特定已选课程的学生,并且这些学生所选的课程中又包含特定已选学生的课程。

首先,我们需要创建学生和课程的类,并初始化数据集合:

class Student

{

public string Name { get; set; }

public List SelectedCourses { get; set; }

}

class Course

{

public string Name { get; set; }

public List SelectedStudents { get; set; }

}

List students = new List

{

new Student { Name = "Tom", SelectedCourses = new List { "Math", "English" } },

new Student { Name = "John", SelectedCourses = new List { "English", "Physics" } },

new Student { Name = "Alice", SelectedCourses = new List { "Math", "Physics" } }

};

List courses = new List

{

new Course { Name = "Math", SelectedStudents = new List { "Tom", "Alice" } },

new Course { Name = "English", SelectedStudents = new List { "Tom", "John" } },

new Course { Name = "Physics", SelectedStudents = new List { "John", "Alice" } }

};

接下来,我们使用Fluent LINQ进行筛选。首先,我们选择那些包含特定已选课程的学生,可以使用`Where`方法和`Contains`方法实现:

string selectedCourse = "Math";

var selectedStudents = students.Where(s => s.SelectedCourses.Contains(selectedCourse));

然后,我们选择那些学生所选的课程中又包含特定已选学生的课程,可以使用`Where`方法和`Any`方法实现:

string selectedStudent = "Tom";

var selectedCourses = courses.Where(c => c.SelectedStudents.Any(s => s == selectedStudent));

最后,我们可以将两个筛选结果合并,得到最终的结果:

var result = selectedStudents.Where(s => selectedCourses.Any(c => c.Name == s.SelectedCourses)).ToList();

这样,我们就成功选择了包含特定已选课程的学生,并且这些学生所选的课程中又包含特定已选学生的课程。

示例代码:

using System;

using System.Collections.Generic;

using System.Linq;

class Student

{

public string Name { get; set; }

public List SelectedCourses { get; set; }

}

class Course

{

public string Name { get; set; }

public List SelectedStudents { get; set; }

}

class Program

{

static void Main(string[] args)

{

List students = new List

{

new Student { Name = "Tom", SelectedCourses = new List { "Math", "English" } },

new Student { Name = "John", SelectedCourses = new List { "English", "Physics" } },

new Student { Name = "Alice", SelectedCourses = new List { "Math", "Physics" } }

};

List courses = new List

{

new Course { Name = "Math", SelectedStudents = new List { "Tom", "Alice" } },

new Course { Name = "English", SelectedStudents = new List { "Tom", "John" } },

new Course { Name = "Physics", SelectedStudents = new List { "John", "Alice" } }

};

string selectedCourse = "Math";

var selectedStudents = students.Where(s => s.SelectedCourses.Contains(selectedCourse));

string selectedStudent = "Tom";

var selectedCourses = courses.Where(c => c.SelectedStudents.Any(s => s == selectedStudent));

var result = selectedStudents.Where(s => selectedCourses.Any(c => c.Name == s.SelectedCourses)).ToList();

foreach (var student in result)

{

Console.WriteLine(student.Name);

}

}

}

运行结果:

Tom

通过Fluent LINQ,我们可以很方便地选择包含子列表的父列表,其中存在子集的子集。在上面的示例中,我们成功选择了包含特定已选课程的学生,并且这些学生所选的课程中又包含特定已选学生的课程。这为我们处理复杂的数据筛选提供了便利,提高了开发效率。