📜  查询关联表 ef6 - C# (1)

📅  最后修改于: 2023-12-03 15:40:26.574000             🧑  作者: Mango

查询关联表 EF6 - C#

在 ASP.NET 中,Entity Framework 是一种常见的 ORM 工具,它可以通过对象关系映射(ORM)自动将数据库中的表映射到 C# 类。当涉及到关联表(即多对多关系)时,EF6 提供了许多方便的方法来查询这些表。在本文中,我们将讨论如何使用 EF6 在 C# 中查询关联表。

准备工作

在开始之前,我们需要创建一个简单的数据库,其中包含两个表,即 Students 和 Courses。每个 Student 可以注册多个 Course,而每个 Course 也可以被多个 Student 所注册。

我们需要在 Package Manager Console 中打开程序包管理器并运行以下命令:

PM> Install-Package EntityFramework
PM> Enable-Migrations
PM> Add-Migration Initial
PM> Update-Database

这将生成 EF6 所需的核心文件,并创建一个名为 Students 和 Courses 的数据表。

查询关联表

让我们假设我们有以下两个实体:

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Student> Students { get; set; }
}

注意上面的实体间关系,它们都有一个虚拟属性来表示另一个实体类型的集合。

常规查询关联表

假设我们想查询 Student 和它所关联的 Courses。我们可以使用以下代码:

using (var context = new SchoolContext())
{
    var studentsWithCourses = context.Students.Include("Courses");

    foreach (var student in studentsWithCourses)
    {
        Console.WriteLine(student.Name);

        foreach (var course in student.Courses)
        {
            Console.WriteLine("\t" + course.Name);
        }
    }
}

在上面的代码中,我们可以看到 context.Students.Include("Courses") 调用了 Include 方法,该方法将 Students 和 Courses 表所属的导航属性同时加载到内存中。然后我们需要遍历每个学生并输出其所选课程的名称。通过以上代码,我们就可以查询到每个学生所关联的课程。

带过滤的关联表查询

如果我们只想获取某个特定学生所选的课程,可以使用以下代码:

using (var context = new SchoolContext())
{
    var studentWithCourses = context.Students
        .Where(s => s.Name == "John Doe")
        .Include("Courses")
        .FirstOrDefault();

    Console.WriteLine(studentWithCourses.Name);

    foreach (var course in studentWithCourses.Courses)
    {
        Console.WriteLine("\t" + course.Name);
    }
}

在上面的代码中,我们使用 Where 方法筛选出名称为“John Doe”的学生。然后我们使用 Include 方法加载每个学生所选的课程。由于我们只想获取单个学生,因此我们在结果上使用 FirstOrDefault() 方法。这样,我们就可以获得适合过滤条件的学生和他所选的课程。

带多级关联的查询

有时我们可能需要查询关联表的多个级别。这个查询可以通过嵌套 Include 语句实现。例如,如果我们想获得课程所关联的 Teacher,可以使用以下代码:

using (var context = new SchoolContext())
{
    var coursesWithTeachers = context.Courses
        .Include(c => c.Students.Select(s => s.Courses))
        .Include(c => c.Teacher);

    foreach (var course in coursesWithTeachers)
    {
        Console.WriteLine(course.Name);
        Console.WriteLine("\tTeacher: " + course.Teacher.Name);
        Console.WriteLine("\tStudents:");

        foreach (var student in course.Students)
        {
            Console.WriteLine("\t\t" + student.Name);
        }
    }
}

在上面的代码中,我们使用了嵌套 Include 语句加载多级关联表。第一个 Include 语句通过其 Select 子句向下迭代到 (Course => Student => Course) 多级关联的表。

然后,我们再次使用 Include 方法加载 Teacher 关联表,以便获取 Teacher 的姓名和每个学生所选的课程。

通过以上方法,我们就能够像在 SQL 查询中一样深入关联表,并查询多个级别的数据。

结论

通过 EF6,我们就能够使用 C# 快速查询关联表。无论是查询单个实体还是关联表的多个级别,EF6 都提供了简单而强大的方式来解决这个问题。通过上述方法,您可以快速而容易地访问关联表中的复杂数据,并将其转换为 C# 类型。