编辑
2025-09-22
C#
00

目录

实体类定义
School 实体类
Class 实体类
Student 实体类
导航查询示例
示例1:查询班级及其所属学校信息
示例2:查询学校及其所有班级信息
示例3:查询学生及其班级和学校信息
结语

SqlSugar是一个轻量级的.NET ORM框架,它提供了丰富的功能来简化数据库操作。其中,导航查询是SqlSugar提供的一项强大功能,它允许开发者通过对象的属性来访问关联的数据,从而实现复杂的查询逻辑。本文将通过具体的例子,深入探讨SqlSugar中的导航查询功能。

实体类定义

为了演示导航查询,我们首先定义几个简单的实体类:Student(学生)、Class(班级)和School(学校)。这些实体类之间存在关联关系,具体如下:

  • 一个School可以有多个Class
  • 一个Class可以有多个Student

School 实体类

C#
public class School { [SqlSugar.SugarColumn(IsPrimaryKey =true)] public int Id { get; set; } public string Name { get; set; } [Navigate(NavigateType.OneToMany, nameof(Class.SchoolId))] public List<Class> Classes { get; set; } }

Class 实体类

C#
public class Class { [SqlSugar.SugarColumn(IsPrimaryKey =true)] public int Id { get; set; } public string Name { get; set; } public int SchoolId { get; set; } [Navigate(NavigateType.OneToMany, nameof(Student.ClassId))] public List<Student> Students { get; set; } [Navigate(NavigateType.OneToOne, nameof(SchoolId))] public School School { get; set; } }

Student 实体类

C#
public class Student { public int Id { get; set; } public string Name { get; set; } public int ClassId { get; set; } [Navigate(NavigateType.OneToOne, nameof(ClassId))] public Class Class { get; set; } }

在上面的实体类中,我们使用了[Navigate]特性来定义导航属性。这些导航属性将被SqlSugar用来解析实体之间的关系,并实现导航查询。

导航查询示例

示例1:查询班级及其所属学校信息

C#
// 创建一个针对Class实体的SqlSugar仓储实例。这个仓储提供了许多方便的方法来操作数据库。 SqlSugarRepository<Class> _repClass = new SqlSugarRepository<Class>(); // 使用仓储的AsQueryable方法开始构建一个查询,这个查询会返回Class实体的集合。 // Includes方法用于指定我们还想要加载与Class实体相关联的School实体。 // 这是一个导航属性加载,意味着除了Class表的信息外,还会加载与之关联的School表的信息。 var classesWithSchool = _repClass.AsQueryable().Includes(x => x.School).ToList(); // 遍历查询结果,这个结果是一个包含了Class实体的列表,其中每个Class实体都包含了关联的School实体。 foreach (var classInfo in classesWithSchool) { // 对于列表中的每个Class实体,打印出班级的名称和该班级所属学校的名称。 Console.WriteLine($"Class Name: {classInfo.Name}, School Name: {classInfo.School.Name}"); }

image.png

我们能够一次性获取到班级和对应学校的信息,这是通过ORM框架提供的导航属性加载功能实现的。这种方式使得在处理关联数据时更加高效和直观。

示例2:查询学校及其所有班级信息

C#
// 创建一个针对School实体的SqlSugar仓储实例。这个仓储提供了许多方便的方法来操作数据库。 SqlSugarRepository<School> _repSchool= new SqlSugarRepository<School>(); // 使用仓储的AsQueryable方法开始构建一个查询,这个查询会返回School实体的集合。 // Includes方法用于指定我们还想要加载与School实体相关联的Classes集合。 // 这是一个导航属性加载,意味着除了School表的信息外,还会加载与之关联的所有Class表的信息。 var schoolsWithClasses = _repSchool.AsQueryable() .Includes(x => x.Classes).ToList(); // 遍历查询结果,这个结果是一个包含了School实体的列表,其中每个School实体都包含了关联的Classes集合。 foreach (var school in schoolsWithClasses) { // 对于列表中的每个School实体,打印出学校的名称。 Console.WriteLine($"School Name: {school.Name}"); // 遍历该学校下的所有班级信息。 foreach (var classInfo in school.Classes) { // 打印出每个班级的名称。 Console.WriteLine($" - Class Name: {classInfo.Name}"); } }

image.png

这个例子演示了如何查询学校及其下属的所有班级信息。通过在School实体上使用Includes方法,我们可以轻松地实现这一复杂的查询需求。

示例3:查询学生及其班级和学校信息

C#
// 创建一个针对Student实体的SqlSugar仓储实例。这个仓储提供了许多方便的方法来操作数据库。 SqlSugarRepository<Student> _repStudent = new SqlSugarRepository<Student>(); // 使用仓储的AsQueryable方法开始构建一个查询,这个查询会返回Student实体的集合。 // Includes方法用于指定我们还想要加载与Student实体相关联的Class实体,同时也想要加载Class实体关联的School实体。 // 这是一个多重导航属性加载,意味着除了Student表的信息外,还会加载与之关联的Class表的信息以及Class表关联的School表的信息。 var studentsWithClassAndSchool = _repStudent.AsQueryable() .Includes(x => x.Class, x => x.School) .ToList(); // 遍历查询结果,这个结果是一个包含了Student实体的列表,其中每个Student实体都包含了关联的Class实体,而每个Class实体又包含了关联的School实体。 foreach (var student in studentsWithClassAndSchool) { // 对于列表中的每个Student实体,打印出学生的名称、所在班级的名称以及班级所属学校的名称。 Console.WriteLine($"Student Name: {student.Name}, Class Name: {student.Class.Name}, School Name: {student.Class.School.Name}"); }

image.png

在这个例子中,我们展示了如何使用链式Includes方法来实现多级导航查询。这允许我们在一个查询中同时获取学生、其所在班级以及班级所属学校的信息。

结语

SqlSugar的导航查询功能极大地简化了处理复杂关联数据的查询逻辑。通过上述示例,我们可以看到,无论是单级还是多级导航查询,SqlSugar都能提供简洁而强大的解决方案。希望本文能帮助你更好地理解和使用SqlSugar的导航查询功能,以提高你的数据处理效率。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!