📅  最后修改于: 2023-12-03 15:40:26.574000             🧑  作者: Mango
在 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# 类型。