SqlSugar是一个轻量级的.NET ORM框架,它提供了丰富的功能来简化数据库操作。其中,导航查询是SqlSugar提供的一项强大功能,它允许开发者通过对象的属性来访问关联的数据,从而实现复杂的查询逻辑。本文将通过具体的例子,深入探讨SqlSugar中的导航查询功能。
为了演示导航查询,我们首先定义几个简单的实体类:Student
(学生)、Class
(班级)和School
(学校)。这些实体类之间存在关联关系,具体如下:
School
可以有多个Class
Class
可以有多个Student
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; }
}
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; }
}
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用来解析实体之间的关系,并实现导航查询。
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}");
}
我们能够一次性获取到班级和对应学校的信息,这是通过ORM框架提供的导航属性加载功能实现的。这种方式使得在处理关联数据时更加高效和直观。
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}");
}
}
这个例子演示了如何查询学校及其下属的所有班级信息。通过在School
实体上使用Includes
方法,我们可以轻松地实现这一复杂的查询需求。
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}");
}
在这个例子中,我们展示了如何使用链式Includes
方法来实现多级导航查询。这允许我们在一个查询中同时获取学生、其所在班级以及班级所属学校的信息。
SqlSugar的导航查询功能极大地简化了处理复杂关联数据的查询逻辑。通过上述示例,我们可以看到,无论是单级还是多级导航查询,SqlSugar都能提供简洁而强大的解决方案。希望本文能帮助你更好地理解和使用SqlSugar的导航查询功能,以提高你的数据处理效率。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!