ORM核心功能之导航属性- EFCore和 SqlSugar

这篇具有很好参考价值的文章主要介绍了ORM核心功能之导航属性- EFCore和 SqlSugar。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导航属性

导航属性是作为.NET ORM核心功能中的核心,在SqlSugar没有支持导航属性前,都说只是一个高级DbHelper, 经过3年的SqlSugar重构已经拥有了一套

非常成熟的导航属性体系,本文不是重点讲SqlSugar而是重点讲导航属性的作用,让更多写Sql人还未使用ORM的人了解到ORM的作用。

 文章来源地址https://www.toymoban.com/news/detail-471825.html

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<Person>()
.Where(it=>it.Files.Any(y=>y.ChildFiles.Any(s=>s.name=="A"))).ToList()

用SQL写如下:

SELECT p.*
FROM Person p
WHERE 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 ICollection<Course> Courses { get; set; }
}

public class Course
{
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    // 其他课程属性...

    public virtual ICollection<Student> Students { get; set; }
}

public class StudentCourse
{
 public int CourseId { get; set; }
  public int StudentId { get; set; }

}
// 配置多对多关系 
protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ modelBuilder.Entity<Student>() 
.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 ICollection<Employee> 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<Department>()
        .HasMany(d => d.Employees)
        .WithOne(e => e.Department)
        .HasForeignKey(e => e.DepartmentId);
}

 

SqlSugar导航属性配置

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 List<B1> BList { 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<A1> 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 List<BookA> Books { get; set; }//注意禁止给books手动赋值

} 

 

SqlSugar 2023年导航新功能

SqlSugar 第一层自动导航

var list3 = db.Queryable<UnitaStudentA>()
              .IncludesAllFirstLayer().ToList();//有重载可以排除不想要的
               
               //排除说明:
               //IncludesAllFirstLayer(nameof(UnitaStudentA.ProjectPhases)) 
               //这样就是排除ProjectPhases的导航属性
               //可以排除多个
               //IncludesAllFirstLayer("a","b") 
               
//自动导航如果有重复的情况: 谁在前面执行哪个
var list3 = db.Queryable<UnitaStudentA>()
              .Includes(it=>it.Order.Where(s=>s.id==1).ToList())
              .IncludesAllFirstLayer().ToList();//自动导航和Order重复
               
//根据名字导航              
db.Queryable<Order>()
//等同于Includes(it=>it.ProjectPhases)
.IncludesByNameString(nameof(Order.ProjectPhases)).ToList()

SqlSugar第二层半自动

//自动写法,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.71
var list = db.Queryable<Student_004>()
        .Includes(x => x.books)
        .Select(x => new Student_004DTO
           {
             books = x.books 
              
            }, true)//true是自动映射其他属性,匿名对象需要手动
           .ToList();
                  
                 
//Mapster转换  5.1.4.71
var list = db.Queryable<Student_004>()
        .Includes(x => x.books)
        .Select(x => new Student_004DTO
         {
           name=x.Name,
           books = x.books.Adapt<List<BooksDTO>>() //导航对象用 Mapster转换 (NUGET安装)
         })
        .ToList();            
 
//DTO中用方法  5.1.4.71
var list = db.Queryable<Student_004>()
         .Includes(x => x.books)
         .Select(x => new Student_004DTO
                 {
                   name=x.Name, 
                   //可以是C#任何方法结尾
                   bookIds=x.books.Select(it=>it.id).ToList()
                 })
                .ToList();   
 
//联表查询用DTO写法  5.1.4.71           
var list5= db.Queryable<Student_004>()
           .Includes(x => x.school_001, x => x.rooms)
           .Includes(x => x.books)
           .LeftJoin<Order>((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();

当你遇到繁琐的数据库操作时,.NET SQLSugar就像是一双温暖的手,帮你轻松解决难题。它是一个强大的工具,让你的数据库管理变得更简单、更高效。下载.NET SQLSugar吧,让它成为你的数据之路上的得力助手,让你的编程之旅充满感动与喜悦!

原码下载: https://github.com/DotNetNext/SqlSugar

 

总结:

.NET中无论是EF CORE还是SQLSUGAR 使用了导航属性都不再需要费心写繁琐的SQL语句,只需简单地调用导航属性,便能轻松获取所需的数据。让我们一起追随这份感动,选择使用导航属性,让编程的旅途更加愉悦,让代码的世界充满美好与便捷!

 

到了这里,关于ORM核心功能之导航属性- EFCore和 SqlSugar的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET ORM 鉴别器 和 TDengine 使用 -SqlSugar

    SqlSugar 是一款 老牌 .NET 开源多库架构ORM框架 ,一套代码能支持多种数据库像Admin.net、Blog.Core、CoreShop等知名开源项目都采用了SqlSugar作为底层 在不用任何设计模式,任何框架的情况下都可以拥有最佳体验,SqlSugar做到了保姆一样的服务,直接用不需要学习 的框架,各种默认值

    2024年02月14日
    浏览(48)
  • c# 实现sql查询DataTable数据集 对接SqlSugar ORM

    有时候对于已经查询到的数据集,想要进行二次筛选或者查询,还得再查一遍数据库 或者其他的一些逻辑处理不太方便,就想着为什么不能直接使用sql来查询DataTable呢? 搜索全网没找到可用方案,所以自己实现了一个。 主要实现思路是使用 SQLite In-Memory Database 内存数据库,

    2024年02月12日
    浏览(37)
  • NET8 ORM 使用AOT SqlSugar 和 EF Core

    .Net8的本地预编机器码NET AOT,它几乎进行了100%的自举。微软为了摆脱C++的钳制,做了很多努力。也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等。而需要C++做的,也就仅仅是引导程序,本篇通过代码来看下这段至关重要的引导程序的运作模式。      SqlSugar已经

    2024年02月05日
    浏览(55)
  • .NET-4.ORM 常见框架EFcorn、Dapper、SqlSugar、FreeSql 和ADO.NET

    学习参考: 1. .NET 6教程,.Net Core 2022视频教程,杨中科主讲— 以及资料参考 2. 官方文档EF core 常用的语句 3..netmvc https://www.cnblogs.com/1016391912pm/p/12024671.html https://github.com/dotnet/EntityFramework.Docs/tree/main/samples/core/Querying/Overview 第一个EFCore应用 https://docs.microsoft.com/zh-cn/ef/core/modeli

    2024年02月04日
    浏览(47)
  • asp.net core EFCore 属性配置与DbContext

    Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。用于程序中的class类和数据库中的表互相之间建立映射关系。在学习过程中,EFCore中的属性配置显的尤为重要它是学习好asp.net core的基础是配置数据库表结构的重要基石。本篇内容为

    2024年02月07日
    浏览(63)
  • SqlSugar框架之WPF应用端功能介绍

     WPF应用端是我们《SqlSugar开发框架》多端界面中的一部分,和Winform前端框架、Vue3+ElementPlus前端、UniApp+Thorn移动端,组成一个完整的整体框架,后端服务是基于SqlSugar的基础ORM的.netcore框架,提供Web API服务供各个前端使用,底层支持多种数据库,包括SqlServer、Oracle、Mysql、Po

    2024年02月08日
    浏览(44)
  • 采用SqlSugar的DBFirst相关功能创建数据库表对应的实体类

      .NET Core官方教程中推荐使用的EF Core数据库ORM框架虽然能用,但是用起来并不是太方便(或者是不习惯,之前用的最多的还是linq)。之前下载的开源博客项目中使用的SqlSugar,后者是由果糖大数据科技团队维护和更新 ,开箱即用最易上手的.NET ORM框架,开源生态仅次于EF

    2024年02月11日
    浏览(32)
  • 基于SqlSugar的开发框架循序渐进介绍(30)-- 整合客户关系管理系统模块功能

    以前在随笔《Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示 》的几篇随笔中介绍过基于WInform开发框架开发的CRM系统,系统的功能主要也是围绕着客户相关信息来进行管理的,经过一些客户的定制应用,以及框架各种功能的完善,系统也已经很完善了

    2024年02月07日
    浏览(53)
  • .NET 主流 ORM 功能介绍 大全 最新

    ​ 下面是3款.NET 使用最多的ORM,来自公众号投票结果 ,数据比较真实可靠,也可去搜索公众号继续投票  2023年11月投票结果 测试项目 发布时间 微信公众号投票 (追逐时间光者) 使用难度 功能 性能 SqlSugar  orm 2014 26%  491票 适中 全 中高 EFCore   orm 2016 36%  663票 较难 全 中高

    2024年02月05日
    浏览(43)
  • Unity核心10——导航寻路系统

    Unity 中的导航寻路系统是能够让我们在游戏世界当中,让角色能够从一个起点准确的到达另一个终点,并且能够自动避开两个点之间的障碍物选择最近最合理的路径进行前往 ​ Unity 中的导航寻路系统的本质,就是在 A 星寻路算法的基础上进行了拓展和优化 导航网格(NavMes

    2024年02月10日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包