SqlSugar 5.联表查询

这篇具有很好参考价值的文章主要介绍了SqlSugar 5.联表查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

用到的几个实体类

使用 CodeFirst 创建表

public class Custom
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        
        public string Name { get; set; }
    }
    
    
public class Order
    {
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int Id { get; set; }
        
        public string Name { get; set; }
        
        public decimal Price { get; set; }
        
        [SugarColumn(IsNullable = true)]
        
        public DateTime CreateTime { get; set; }
        
        [SugarColumn(IsNullable = true)]
        public int CustomId { get; set; }
    }
    

public class OrderDetail
    {
        [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
        public int ItemId { get; set; }
        
        public int OrderId { get; set; }
        
        public decimal? Price { get; set; }
        
        [SqlSugar.SugarColumn(IsNullable = true)]
        public DateTime? CreateTime { get; set; }
        
        [SugarColumn(IsIgnore = true)]
        public Order Order { get; set; }
    }
    
    
public class ViewOrder : Order
    {
        public string CustomName { get; set; }
    }

1.Join用法

1.1 语法糖1

优点:好理解,五个表以内的联表比较推荐

1.1.1 表和表的连接
List<ViewOrder> list = db.Queryable<Order>()
                .LeftJoin<Custom>((o, cus) => o.CustomId == cus.Id) //若是多个条件 用 &&
                .LeftJoin<OrderDetail>((o, cus, oritem) => o.Id == oritem.OrderId)
                 .Where((o, cus, oritem) => o.Id == 4 && oritem.Price == 50)
                .Select((o, cus) => new ViewOrder { Id = o.Id, CustomName =cus.Name })
                .ToList();
                
            //    SELECT  `o`.`Id` AS `Id` , `cus`.`Name` AS `CustomName`  FROM `Order` o
            //    Left JOIN `Custom` cus ON( `o`.`CustomId` = `cus`.`Id` )  
            //    Left JOIN `OrderDetail` oritem ON( `o`.`Id` = `oritem`.`OrderId` )   
            //    WHERE( `o`.`Id` = '4')

若将 .Select((o, cus) => new ViewOrder { Id = o.Id, CustomName =cus.Name }) 修改成.Select((o, cus) => new ViewOrder()) 那就是查询所有字段

1.1.2 表和Queryable的连接 (主表左连了一个由子查询组合的表)
var rightQueryable = db.Queryable<Custom>()
                .LeftJoin<OrderDetail>((c, o) => c.Id == o.ItemId)
                .Select(c => c);

var list = db.Queryable<Order>()
               .LeftJoin(rightQueryable, (o, r) => o.CustomId == r.Id)
               .Where(o=>o.Id==4)
               .Select(o => o)
               .ToList();


//SELECT o.* FROM `Order` o 
//Left JOIN(SELECT c.*FROM `Custom` c Left JOIN `OrderDetail` o ON( `c`.`Id` = `o`.`ItemId` )   ) r ON ( `o`.`CustomId` = `r`.`Id` )
//WHERE( `o`.`Id` = '4')
1.1.3 Queryable和表的连接 (以一个子查询为主表关联其他表)
var queryable = db.Queryable<Order>();

var list = db.Queryable(queryable)
            .LeftJoin<Custom>((o, c) => o.CustomId == c.Id)
            .LeftJoin<OrderDetail>((o, c, od) => o.Id == od.OrderId).Select(o => o)
            .Where(o => o.Id == 4)
            .ToList();
            
//SELECT o.* FROM  
//(SELECT * FROM  (SELECT `Id`,`Name`,`Price`,`CreateTime`,`CustomId` FROM `Order`  ) t ) o 
//Left JOIN `Custom` c ON ( `o`.`CustomId` = `c`.`Id` )  
//Left JOIN `OrderDetail` od ON ( `o`.`Id` = `od`.`OrderId` )   
//WHERE ( `o`.`Id` = '4' )
1.2 语法糖2
  • 优点:五个表以上用这种方式比较快捷
  • 缺点:不能套子查询( leftjoin(queryable) )
var list = db.Queryable<Order, Custom, OrderDetail>((o, c, od) => new JoinQueryInfos(
            JoinType.Left, o.CustomId == c.Id,
            JoinType.Left, o.Id == od.OrderId
            ))
            .Select((o, c, od) => new { Id = o.Id, Name = o.Name, Cname = c.Name, Price = od.Price, CreateTime = od.CreateTime})
            .ToList();

//SELECT  `o`.`Id` AS `Id` , `o`.`Name` AS `Name` , `c`.`Name` AS `Cname` , `od`.`Price` AS `Price` , `od`.`CreateTime` AS `CreateTime`  FROM `Order` o
//Left JOIN `Custom` c ON( `o`.`CustomId` = `c`.`Id` )  
//Left JOIN `OrderDetail` od ON( `o`.`Id` = `od`.`OrderId` )
1.3 语法糖3
  • ‘inner join 可以用这种方式’
 var list = db.Queryable<Order, Custom, OrderDetail>((o, c, od) => o.CustomId == c.Id && o.Id == od.OrderId)
               .Select((o, c, od) => new { Id = o.Id, Name = o.Name, Cname = c.Name, Price = od.Price, CreateTime = od.CreateTime })
               .ToList();
               
//SELECT  `o`.`Id` AS `Id` , `o`.`Name` AS `Name` , `c`.`Name` AS `Cname` , `od`.`Price` AS `Price` , `od`.`CreateTime` AS `CreateTime`  
//FROM `Order` o  ,`Custom`  c ,`OrderDetail`  od
//WHERE(( `o`.`CustomId` = `c`.`Id` ) AND( `o`.`Id` = `od`.`OrderId` ))

2.Where用法

注意:写在 Select() 之前

.Where(o => o.Id == 4)
.Where((o, cus, oritem) => o.Id == 4 && oritem.Price == 50)

3.OrderBy用法

注意:写在 Select() 之前

.OrderBy(st => st.StudentId) 
.OrderBy((st, sc) => sc.SchoolId, OrderByType.Desc)

4.GroupBy用法

注意:写在 Select() 之前

.GroupBy(it => it.Name)
.GroupBy((st, sc) => sc.SchoolId)

5.Select用法

连表必须加上 Select 不然会查询出重复列而报错,一般 Select() 写在 ToList() 之前

基础用法

//新类
.Select((o,i)=>new 类名{Id=o.Id,Name=o.Name,SchoolName=i.Name}).ToList();

//匿名对象
.Select((o,i)=>new {Id=o.Id,Name=o.Name,SchoolName=i.Name}).ToList();
5.1 返回匿名对象
5.1.1 一个一个字段赋值

参考 "1.2 语法糖2" 中 Select的写法

5.1.2 自动主表赋值 表.*
  • o.Id是表的任意一个属性, SelectAll是查询全部 o.*
  • .SelectAll等同于SqlFunc.GetSelfAndAutoFill是个语法糖
 var list = db.Queryable<Order, Custom, OrderDetail>((o, c, od) => new 
        JoinQueryInfos(
                JoinType.Left, o.CustomId == c.Id,
                JoinType.Left, o.Id == od.OrderId
                ))
                 .Select((o, c, od) => new { 
                 d = o.Id.SelectAll(), 
                 CName = c.Name, 
                 Time = od.CreateTime })
                .ToList();
                
//SELECT o.*, `c`.`Name` AS `CName` , `od`.`CreateTime` AS `Time`  FROM `Order` o
//Left JOIN `Custom` c ON ( `o`.`CustomId` = `c`.`Id` )
//Left JOIN `OrderDetail` od ON ( `o`.`Id` = `od`.`OrderId` )
5.2 返回到新类

参考 "1.1.1 表和表的连接" 中 Select的写法

5.3 自动映射机制

Select用的是自动填充这样使用方便,高并发的地方还是写成上面那种方式

var list = db.Queryable<Order, Custom, OrderDetail>((o, c, od) => new 
        JoinQueryInfos(
                JoinType.Left, o.CustomId == c.Id,
                JoinType.Left, o.Id == od.OrderId
                ))
                 .Select<ViewOrder>()
                .ToList();

//SELECT c.`Name` AS `CustomName`,o.`Id` AS `Id`,o.`Name` AS `Name`,o.`Price` AS `Price`,o.`CreateTime` AS `CreateTime`,o.`CustomId` AS `CustomId` 
//FROM `Order` o
//Left JOIN `Custom` c ON( `o`.`CustomId` = `c`.`Id` )  
//Left JOIN `OrderDetail` od ON( `o`.`Id` = `od`.`OrderId` )
5.4 更多用法
  • Select用法太多,这篇文章主要讲联表查询
  • 更多用法看官网

6.Full Join用法

文档参考:联表查询文章来源地址https://www.toymoban.com/news/detail-400064.html

到了这里,关于SqlSugar 5.联表查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Mysql 复杂查询丨联表查询

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 联表查询(Join)是一种在数据库中使用多个表进行关联查询的操作。它通过使用 JOIN 将多个表连接在一起,并根据关联条件从这些表中检索数据 INNER JOIN(内连接) 内连接(Inner Join)是一种在联表查询中使用的

    2024年02月13日
    浏览(38)
  • Django 联表查询操作

    在日常的开发中,常常需要对多张数据表同时进行数据查询。多表查询需要在数据表之间建立表关系才能够实现。一对多或一对一的表关系是通过外键实现关联的,而多表查询分为正向查询和反向查询。 以歌手表、专辑表、单曲表查询为例子。 歌手与专辑为一对多关系;歌

    2024年02月07日
    浏览(37)
  • 【最佳实践】gorm 联表查询 joins

    内容 使用gorm的一些技巧、经验 常规使用示例 如何在一对一、一对多、多对一的关系下使用gorm进行联表查询 其他gorm使用和进阶用法参考官方文档 https://gorm.io/zh_CN/docs/index.html 优雅表迁移注册 表自动迁移方式,常见的方式如下: 这种显示调用方式的缺点是每次新建表结构都

    2024年02月06日
    浏览(44)
  • MySQL 联表查询重复数据并删除(子查询删除记录) SQL优化

    数据库表介绍: table_a :主表(小表,表数据不可重复) table_b :流水表(大表,记录审核流水数据) 注:两表表结构大致一致,流水表增加一个审核状态的字段 业务逻辑: 主表保存唯一数据,流水表记录审核流水数据,用于后续展示,并在审核成功后插入主表,在插入流

    2023年04月08日
    浏览(65)
  • JPA 如何修改 联表查询返回的Map

    记录解决两个问题: 解决方法: 不直接修改这个 Map。如果你需要对 Map 进行修改操作,你可以创建一个新的 Map,然后将原 Map 的内容复制到新 Map 中。  第二个问题就是如何创建一个空的PageMap 把数据拷贝进去了 参数描述:    创建新对象并赋值伪代码如下:

    2024年04月27日
    浏览(30)
  • SQL联表查询LEFT JOIN 数据去重复

    使用left join联表查询时,如果table1中的一条记录对应了table2的多条记录,则会重复查出id相同的多条记录。 解决方法: 将查询结果作为中间表,使用group by 进行去重 如果想对group by后的数据计算count,可以将查询结果作为中间表再计算count

    2024年02月11日
    浏览(67)
  • Mybatis的三种映射关系以及联表查询

    目录 一、概念 二、一对一 1、配置generatorConfig.xml 2、Vo包的编写 3、xml的sql编写 4、编写对应接口及实现类 5、测试 三、一对多 1、Vo包类的编写 2、xml的sql编写 3、编写对应接口及实现类 4、测试 四、多对多 1、Vo类 2、xml的sql配置 3、接口及接口实现类 4、测试 1、MyBatis中表之间

    2024年02月10日
    浏览(48)
  • 联表查询的时候外键id是字符串

    2024年02月09日
    浏览(40)
  • QueryWrapper构建复杂的SQL-循环添加条件、联表查询

    QueryWrapper是MyBatis-Plus提供的一个查询构建器,用于构建复杂的SQL查询语句。QueryWrapper可以用于添加条件、排序、分页等操作。 循环添加条件 在QueryWrapper中,可以使用andWhere和orWhere方法来添加多个条件,从而实现循环添加条件。 下面是一个示例代码,演示如何使用QueryWrapper循

    2024年02月16日
    浏览(47)
  • 【python爬虫】给你分享几个日常生活中可以用到的爬虫小程序

    在这篇文章中,我们将分享7个Python爬虫的小案例,帮助大家更好地学习和了解Python爬虫的基础知识。以下是每个案例的简介和源代码: 这个案例使用BeautifulSoup库爬取豆瓣电影Top250的电影名称、评分和评价人数等信息,并将这些信息保存到CSV文件中。 这个案例使用正则表达式

    2024年02月05日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包