
导航属性导航属性是作为ORM核心功能中的核心,在SqlSugar没有支持导航
博客园 2023-06-05 13:32:33
导航属性是作为ORM核心功能中的核心,在SqlSugar没有支持导航属性前,都说只是一个高级DbHelper, 经过3年的SqlSugar重构已经拥有了一套
(资料图片仅供参考)
非常成熟的导航属性体系,本文不是重点讲SqlSugar而是重点讲导航属性的作用,让更多写Sql人还未使用ORM的人了解到ORM的作用。
1.复杂的查询过滤用户根据权限过滤,用户根据组织过滤 等这种多对多情况用SQL就相当复杂 ,例如:用SQL写一个多对多过滤就要联3个表(主表 中间表 从表),如果
Where中用到多个多对多或者嵌套多对多那写SQL简直就是恶梦 (一对多和一对一差也有提升并,没有多对多明显)
//EF CORE查询var Persons= dbContext.Person //需要定义DbSet才能点出来.Where(it=>it.Files.Any(y=>y.ChildFiles.Any(s=>s.name=="A"))).ToList()//SqlSugar 查询var Persons= dbContext.Queryable().Where(it=>it.Files.Any(y=>y.ChildFiles.Any(s=>s.name=="A"))).ToList()
用SQL写如下:
SELECT p.*FROM Person pWHERE EXISTS ( SELECT 1 FROM PersonFile pf INNER JOIN File f ON pf.FileId = f.FileId INNER JOIN PersonFile pf2 ON f.FileId = pf2.FileId WHERE pf.PersonId = p.PersonId AND pf2.PersonId IN ( SELECT p2.PersonId FROM Person p2 INNER JOIN PersonFile pf3 ON p2.PersonId = pf3.PersonId INNER JOIN File f2 ON pf3.FileId = f2.FileId WHERE f2.name = "A" ))
像SAAS系统这种多对多用的非常多,特别在组织、用户、角色、文件等无处理不在,这也是为什么要用ORM的原因
2.复杂的表单提交如果您的人事管理需要包含更多的信息,例如学历和工作经验等字段,您可以在代码中添加相应的实体和关联。
假设您有以下实体:人员(Person)、部门(Department)、职位(Position)、学历(Education)和工作经验(WorkExperience)。
var person = new Person{ // 设置人员属性... Department = new Department { // 设置部门属性... }, Position = new Position { // 设置职位属性... }, Education = new Education { // 设置教育属性... }, WorkExperience = new WorkExperience { // 设置工作经历属性... }};
代码如下:
//SqlSugar 导航插入db.InsertNav(person).Include(z1 => z1.Department) .Include(z1 => z1.Position) .Include(z1 => z1.Education) .Include(z1 => z1.WorkExperience) .ExecuteCommand();//导航插入 一句就能搞定,先插入主表,然后在根据主表的主键在插入从表,特别是自增列用导航代码清爽很多3.多层级结构的查询
因为Sql本身就不支持对多层级结构查询,所以不用ORM想实现高性能的多层级结构是需要花大量精力去优化和写代码的
//EF CORE查询var Persons= dbContext.Person.Include(z1 => z1.Department).Include(z1 => z1.Position).Include(z1 => z1.Education).Include(z1 => z1.WorkExperience).ToList()EF Core导航属性配置
EF多对多
public class Student{ public int StudentId { get; set; } public string StudentName { get; set; } // 其他学生属性... public virtual ICollectionCourses { get; set; }}public class Course{ public int CourseId { get; set; } public string CourseName { get; set; } // 其他课程属性... public virtual ICollection Students { get; set; }}public class StudentCourse{ public int CourseId { get; set; } public int StudentId { get; set; }}// 配置多对多关系 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity () .HasMany(s => s.Courses) .WithMany(c => c.Students) .UsingEntity(j => j.ToTable("StudentCourse")); }
EF一对多和一对一
public class Department{ public int DepartmentId { get; set; } public string DepartmentName { get; set; } // 其他部门属性... public virtual ICollectionSqlSugar导航属性配置Employees { get; set; }}public class Employee{ public int EmployeeId { get; set; } public string EmployeeName { get; set; } // 其他员工属性... public int DepartmentId { get; set; } public virtual Department Department { get; set; }}// 配置一对多关系protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity () .HasMany(d => d.Employees) .WithOne(e => e.Department) .HasForeignKey(e => e.DepartmentId);}
SqlSugar多对多
//实体public class ABMapping1{ [SugarColumn(IsPrimaryKey = true)]//中间表可以不是主键 public int AId { get; set; } [SugarColumn(IsPrimaryKey = true)]//中间表可以不是主键 public int BId { get; set; }}public class A1{ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } public string Name { get; set; } [Navigate(typeof(ABMapping1), nameof(ABMapping1.AId), nameof(ABMapping1.BId))]//注意顺序 public ListBList { get; set; }//只能是null不能赋默认值}public class B1{ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } public string Name { get; set; } [Navigat(typeof(ABMapping1), nameof(ABMapping1.BId), nameof(ABMapping1.AId))]//注意顺序 public List AList { get; set; }//只能是null不能赋默认值}
Sqlugar一对一和一对多
//实体public class StudentA{ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int StudentId { get; set; } public string Name { get; set; }public int SchoolId { get; set; } [Navigate(NavigateType.OneToOne, nameof(SchoolId))]//一对一 SchoolId是StudentA类里面的 public SchoolA SchoolA { get; set; } //不能赋值只能是null}public class SchoolA{ [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id{ get; set; } public string SchoolName { get; set; } [Navigate(NavigateType.OneToMany, nameof(BookA.studenId))]//一对多 BookA表中的studenId public ListSqlSugar 2023年导航新功能SqlSugar 第一层自动导航Books { get; set; }//注意禁止给books手动赋值}
var list3 = db.QueryableSqlSugar第二层半自动() .IncludesAllFirstLayer().ToList();//有重载可以排除不想要的 //排除说明: //IncludesAllFirstLayer(nameof(UnitaStudentA.ProjectPhases)) //这样就是排除ProjectPhases的导航属性 //可以排除多个 //IncludesAllFirstLayer("a","b") //自动导航如果有重复的情况: 谁在前面执行哪个var list3 = db.Queryable () .Includes(it=>it.Order.Where(s=>s.id==1).ToList()) .IncludesAllFirstLayer().ToList();//自动导航和Order重复 //根据名字导航 db.Queryable ()//等同于Includes(it=>it.ProjectPhases).IncludesByNameString(nameof(Order.ProjectPhases)).ToList()
//自动写法,Books下面的A和B都会查询出来.IncludesAllSecondLayer(x=>x.Books) //自动只能有这么多层次,更深层级需要手动写法 //手动写法.Includes(x => x.Books,x=>x.A) .Includes(x => x.Books,x=>x.B)SqlSugar导航DTO转换
在前二年SqlSugar导航只能说够用,并不算好用,今年重点将导航DTO进行了强化
//简单的用法 5.1.4.71var list = db.Queryable() .Includes(x => x.books) .Select(x => new Student_004DTO { books = x.books }, true)//true是自动映射其他属性,匿名对象需要手动 .ToList(); //Mapster转换 5.1.4.71var list = db.Queryable () .Includes(x => x.books) .Select(x => new Student_004DTO { name=x.Name, books = x.books.Adapt >() //导航对象用 Mapster转换 (NUGET安装) }) .ToList(); //DTO中用方法 5.1.4.71var list = db.Queryable
() .Includes(x => x.books) .Select(x => new Student_004DTO { name=x.Name, //可以是C#任何方法结尾 //比如 b.books.FirstOrDefault() (因为是C#方法First没有值会报错) bookIds=x.books.Select(it=>it.id).ToList() }) .ToList(); //联表查询用DTO写法 5.1.4.71 var list5= db.Queryable () .Includes(x => x.school_001, x => x.rooms) .Includes(x => x.books) .LeftJoin ((x, y) => x.Id==y.sid) .Select((x,y) => new Student_004DTO { SchoolId = x.SchoolId, books = x.books, school_001 = x.school_001, Name=y.Name }) .ToList();
当你遇到繁琐的数据库操作时,SQLSugar就像是一双温暖的手,帮你轻松解决难题。它是一个强大的工具,让你的数据库管理变得更简单、更高效。下载SQLSugar吧,让它成为你的数据之路上的得力助手,让你的编程之旅充满感动与喜悦!
原码下载:https://github.com/DotNetNext/SqlSugar
总结:无论是EF CORE还是SQLSUGAR 使用了导航属性都不再需要费心写繁琐的SQL语句,只需简单地调用导航属性,便能轻松获取所需的数据。让我们一起追随这份感动,选择使用导航属性,让编程的旅途更加愉悦,让代码的世界充满美好与便捷!
导航属性导航属性是作为ORM核心功能中的核心,在SqlSugar没有支持导航
河南启动2023年工贸重点企业有限空间作业专家指导服务
本网讯(通讯员顾毅记者王玮丽)3月在上海首次发布自主研发的国内首款
据巨浪视频,6月3日,辽宁沈阳张先生发视频称,奥体中心张杰演唱会场外
要润肤,樱桃补。常吃枣,不显老。养生是一种生活态度,是指通过科
6月3日深圳市福田区第一届《“獭獭杯”生态主持人选拔活动》决赛暨生态IP——福獭发布会在华富街道的深业上
只要各方坚定信心、决心和耐心,做好自己的事,走好该走的路,难题就会迎刃而解,各路资金自会蜂拥而至,A
近段时间,A股波动有所加大,一些投资者心绪跟着跌宕起伏、焦虑难安。这反映出部分资金对目前形势的认识不
1、豪爵2、中国摩托车行业报告显示,生产豪爵摩托的大长江集团,总销量达1958万辆,成为年度最畅销摩托企业
1、沃隆的每日坚果确实做到了宣传所说的:甄选全球每一颗。2、一直在吃,品质好的没得说。3、中粮里面坚果
1、玖月奇迹组合,一男一女男叫:王小海女叫:王小玮声明:两人并非兄妹,也没有亲戚男28岁。2、女23岁男家住
1、宾馆外宾贵宾宾语内宾宾客国宾礼宾酬宾上宾宾朋宾白。本文到此分享完毕,希望对大家有所帮助。
来为大家解答以上问题,取暖器有辐射吗孕妇可以用吗,取暖器有辐射吗很多人还不知道,现在让我们一起来看看
一个网友拍下的母亲38岁、48岁、78岁时的照片,让人泪目!,晚景,泪目,大多数,农村老人,生活水平
眼下,河南郑州的220万亩小麦正在进行大规模机收。为减轻前期阴雨天造成的不利影响,当地这几天抓住晴好天