SqlSugar子查询
1、基础教程
1.1 API目录
*****只查一列*****//First: SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Select(s => s.Id) //max例1: SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Max(s => s.Id)//max例2: SqlFunc.Subqueryable<School>()..Where(s=>s.Id==st.Id).Select(s=>SqlFunc.AggregateMax(s.Id)) //min:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Min(s => s.Id)//avg:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Avg(s => s.Id)//count:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Count()//sum:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Sum(s => s.num)//去重后汇总数量//SqlFunc.Subqueryable<School>().Where(s => z.Id == st.Id).Select(s=>SqlFunc.AggregateDistinctCount(s.Name))//逗号分割列 //SqlFunc.Subqueryable<Order>().Where(z=>z.Id==it.Id).SelectStringJoin(z => z.Name, ",")//完整用例:看标题8 *****返回List或者实体*****新功能:5.1.3.36//SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).ToList()//SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).ToList(it=>new Class(){ Name=it.Name})//更多看标题4*****返回单个实体*****//SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).First() //更多看标题9*****IN、Not in、Exists、Not Exists*****//看标题2 |
1.2 where中使用
var getAll = db.Queryable<Student, School>((st, sc) => new JoinQueryInfos(JoinType.Left,st.Id==sc.Id) ).Where(st => st.Id == SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Select(s => s.Id)).ToList(); /*生成的MYSQL语句,如果是SqlServer就是TOP 1SELECT `st`.`ID`,`st`.`SchoolId`,`st`.`Name`,`st`.`CreateTime` FROM `STudent` st Left JOIN `School` sc ON ( `st`.`ID` = `sc`.`Id` ) WHERE ( `st`.`ID` =(SELECT `Id` FROM `School` WHERE ( `Id` = `st`.`ID` ) limit 0,1))*/ |
1.3 在select中使用
var getAll = db.Queryable<Student, School>((st, sc) => new JoinQueryInfos(JoinType.Left,st.Id==sc.Id )).Select(st => new{ name = st.Name, id = SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Select(s => s.Id) }).ToList(); |
2、IN和NOT IN的操作
2.1 Exists
Exists 和 in 区别在于 Exists 扩展性更强,支持多个字段 (简单的说In能实现的Exists都能实现)
//等同于INvar getAll7 = db.Queryable<Student>().Where(it => SqlFunc.Subqueryable<School>().Where(s =>s.Id==it.Id).Any()).ToList();/*生成的SQL(等于同于it.id in(select id from school)只是写法不一样SELECT `ID`,`SchoolId`,`Name`,`CreateTime` FROM `STudent` it WHERE (EXISTS ( SELECT * FROM `School` WHERE ( `Id` = `it`.`ID` ) )) *///等同于NOT INvar getAll8 = db.Queryable<Student>().Where(it => SqlFunc.Subqueryable<School>().Where(s => s.Id == it.Id).NotAny()).ToList();/*生成的SQLSELECT `ID`,`SchoolId`,`Name`,`CreateTime` FROM `STudent` it WHERE (NOT EXISTS ( SELECT * FROM `School` WHERE ( `Id` = `it`.`ID` ) ))*///搜索关键词:exits |
2.2 In和 Not In (5.0.7.5)
在有GroupBy的情况下==自动转成 in
db.Queryable<Order>().Where(it=>it.Id==SqlFunc.Subqueryable<Custom>().GroupBy(z=>z.OrderId).Select(z=>z.OrderId)).ToList()//Sql//SELECT [Id],[Name] FROM [Order] // WHERE [Id] in ((SELECT [OrderId] FROM [Custom] GROUP BY [OrderId])) |
2.3 分页In
db.Queryable<Order>().In(it=>it.Id,db.Queryable<Order>().Skip(1).Take(100).Select(it=>it.Id)).ToList(); |
3、子查询中使用Sql
最新版本才支持
string sql=" (select top 1 id from [Order] ) "; var list = db.Queryable<Order>() .Select(it => new { name=it.Name, customName= SqlFunc.MappingColumn<string>(sql) //老版本MappingColumn(default(string),sql) }).ToList(); //如果存在SQL拼接将SQL提取到外面在传进来,有些VS拼接会有问题 |
Sql代码如下:
SELECT [Name] AS [name] , (select top 1 id from [Order] ) AS [customName] FROM [Order] |
4、ToList()集合对象
方式1:简单方式(5.1.3.38)
直接在Select中进行ToList ,
性能: 大于循环数倍 ,大部分情况性能小于ThenMapper方式和导航 ,写法简单性能也说的过去
//请升级到 5.1.3.36+ db.Queryable<Order>() .Select(it => new { CustomId = it.CustomId, OrderId = it.Id, OrderName = it.Name, CustomList = SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).ToList() }) .ToList(); //也可以DTO SqlFunc.Subqueryable<Custom>() .Where(c=> c.Id == it.CustomId). ToList(c=> new Class(){ Name=c.Name}) //转成DTO //注意:where ToList里面 c 的别名要一致 //只查List<string>这种集合 SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).ToList(c=>c.Name)//最新版本//自动DTO 5.1.4.70SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).ToList<DTO>()SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).ToList(it=>new DTO(){},true);//和Queryable类似 |
方式2:性能、功能、跨库
该功能在同类框架中性能比较好不会生成垃圾SQL , 在现有结果进行一对多操作
var treeRoot=db.Queryable<Tree>().ToList();//可以联表查询,只要返回List中有关联字段就可以//填充子对象 //原理: 数据库一次读取 In (list[0].id,list[1].id,list[2].id...) 内存分配到对应Child//所以无论集合多少条记录 ThenMapper 只会操作一次库 db.ThenMapper(treeRoot, item => { //用例1:简单填充 //参数解释:子表的ParentId和主表的Id 进行关联查询(有Select写到SetContext前面) //可以额外加Where写SetContext前面,但是不能带有item对象,item要写SetContext里面 item.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => item.Id, item).ToList(); //用例2:可以多属性 //item.Child=xxxx //item.Parent=xxxx //用例3:类型转换类转成DTO (注意:Select中的关联字段要赋值) //item.Child = db.Queryable<Tree>() // .Select(it=>new ViewTree(){ParentId=x.ParentId,Id=i.Id,Name=it.Name }) // .SetContext(x => x.ParentId, () => item.Id, item).ToList(); //用例4:联表填充 //item.Child=db.Queryable<Tree>() //.LeftJoin<Tree>((i,y)=>i.ParentId==y.Id) //.Select((i,y)=>new viewmodel(){ Parentid=i.Parentid..........}) //.SetContext(x => x.ParentId, () => item.Id, item).ToList(); }); //异步var treeRoot=await db.Queryable<Tree>().ToListAsync(); await db.ThenMapperAsync(treeRoot, async item =>{ //给集合赋值 参数解释 子表的ParentId和主表的Id 进行关联查询 item.Child =await db.Queryable<Tree>().SetContextAsync(x=>x.ParentId,()=>item.Id, item);});//无限层级var treeRoot=db.Queryable<Tree>().Where(it => it.Id == 1).ToList();//第一层db.ThenMapper(treeRoot, item =>{ item.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => item.Id, item).ToList();});//第二层db.ThenMapper(treeRoot.SelectMany(it=>it.Child), it =>{ it.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => it.Id, it).ToList();});//跨库 var mydb=db.GetConnection(1);mydb.ThenMapper(root,item=>{...}); |
方式3:导航方式
这种已经不属于子查询了,属于另一个查询体系,详细功能:
https://www.donet5.com/Home/Doc?typeId=1188
5、子查询在Join
5.0.5.4+
var list = db.Queryable<Order>().Where(it => SqlFunc.Subqueryable<A>() .LeftJoin<B>((i,y)=>i.ItemId==y.ItemId) .InnerJoin<C>((i,y,z) => i.ItemId == z.ItemId) .Where((i,y,z)=>i.ItemId==1) .Any() ).ToList();//新版本支持了Subquery.join使用 Where<T1,T2>((x,y)=> x.id==y.id) |
6、子查询使用别名
如果点不出AS请升级
SqlFunc.Subqueryable<A>().AS("A01") //这样查询的就是 A01表 |
7、字符串拼接
5.1.1-preview14 逗号拼接
//sqlerver : FOR XML PATH //mysql sqlite : group_concat //oracle : listagg //pgsql :string_agg var list= db.Queryable<Order>() .Select(it => new { //names="名字1,名字2,名字3" names=SqlFunc.Subqueryable<custom>(). Where(z=>z.oid==it.id) .SelectStringJoin(z => z.Name, ",") }) .ToList();//多字段 不能有null相加 , 字段有null需要加上 z.Name??"".SelectStringJoin(z => SqlFunc.MergeString(z.Name,"-",z.Id.ToString()), ",") |
8、只查一列 (top 1)
//First:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Select(s => s.Id) //max例1:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Max(s => s.Id)//max例2:SqlFunc.Subqueryable<School>().Where(s=>s.Id==st.Id).Select(s=>SqlFunc.AggregateMax(s.Id)) //min:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Min(s => s.Id)//avg:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Avg(s => s.Id)//count:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Count()//sum:SqlFunc.Subqueryable<School>().Where(s => s.Id == st.Id).Sum(s => s.num)//去重后汇总数量//SqlFunc.Subqueryable<School>().Where(s => z.Id == st.Id).Select(s=>SqlFunc.AggregateDistinctCount(s.Name))//逗号分割列 //SqlFunc.Subqueryable<Order>().Where(z=>z.Id==it.Id).SelectStringJoin(z => z.Name, ",")//用例Select(it=> new{ id=it.id, schoolname=SqlFunc.Subqueryable<School>().Where(s=>s.Id==it.ShoolId).Select(s=>s.Name) //对应的Sql: //schoolname=(SELECT `Name` FROM `School` `s` WHERE (`s`.`Id`=`it`.`ShoolId`)limit 0,1) }) //如果要查整个对象:看标题9 |
9、子查询 First()整个对象
//需要升级5.1.4.59var list= db.Queryable<Order>() .Select(it => new { CustomId = it.CustomId, OrderId = it.Id, OrderName = it.Name, CustomList = SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).First() }) .ToList();//可以转DTO SqlFunc.Subqueryable<Custom>().Where(c => c.Id == it.CustomId).First(c=>new xxx(){ yy=c.id })//如果只查一个字段:标题8 |
SqlSugar子查询的更多相关文章
- 深入理解MySql子查询IN的执行和优化
IN为什么慢? 在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕.例如: SELECT driver_id FROM driver where driver_id in (SELECT dr ...
- Mysql - 性能优化之子查询
记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...
- 在SQL Server中为什么不建议使用Not In子查询
在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下 下面 ...
- 读书笔记--SQL必知必会11--使用子查询
11.1 子查询 查询(query),任何SQL语句都是查询.但此术语一般指SELECT语句. SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询. 作为子查询的SELECT语句只能 ...
- 你真的会玩SQL吗?无处不在的子查询
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)
Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...
- 当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式.比如 select * from T_Employee where FNumber not in ( select top 5* ...
- Oracle学习笔记五 SQL命令(三):Group by、排序、连接查询、子查询、分页
GROUP BY和HAVING子句 GROUP BY子句 用于将信息划分为更小的组每一组行返回针对该组的单个结果 --统计每个部门的人数: Select count(*) from emp group ...
- [转]HQL中的子查询
原文地址:http://blog.csdn.net/xb12369/article/details/8638683 子查询: 子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一 ...
- MySQL 子查询与连接操作笔记
SQL语句之间是可以进行连接操作的,在一些复杂的数据操作中必须用到连接操作.简单的说就是一个SQL语句的结果可以作为相连接的SQL操作的一部分.SQL结构化查询语句,子查询是指的所有的SQL操作,并非 ...
随机推荐
- Docker 安装 kafka
简单安装为了集成 SpringBoot,真实使用,增加增加更多配置,比如将log映射出来 1.安装 zookeeper [root@centos-linux ~]# docker pull wurst ...
- HDU - 1560:DNA sequence ( 迭代加深搜索基础题 )
Problem Description The twenty-first century is a biology-technology developing century. We know tha ...
- 【每天一个不会秃头的前端案例】CSS + JS 实现早安,晚安动画
从橘子学姐那边学来的 早安,晚安动画(CSS + js) 成果展示 先看成果. 通过点击太阳实现日夜的动画平滑交替 Movie 这里就不多说什么了,直接贴一下代码 HTML部分 <!DOCTYP ...
- 30例 | 一文搞懂python日期时间处理
前言 datetime是python的内置模块,用来处理日期和时间. 该模块常用的类有: 类名 功能说明 date 日期对象 time 时间对象 datetime 日期时间对象 timedelta 时 ...
- <vue 基础知识 6、条件判断标签v-if>
代码结构 一. 01-v-if用法 1.效果 根据分数的不同展现不同的汉字 2.代码 01-v-if用法.html <!DOCTYPE html> <html lang=&q ...
- C++ std::initializer_list 实现原理勘误
今天正在看侯捷<C++ 新标准 C++11-14>的视频,里面讲到 std::initializer_list 的实现原理,并且把源码贴出来. /// initializer_list t ...
- Idea 进行远程服务器debug操作
本文为博主原创,转载请注明出处: 很多时候为了定位服务器的问题,不方便定位时,采用idea 远程debug 服务器环境的服务进行问题定位,主要操作步骤如下: 1. 修改服务器服务的JVM 配置,开启远 ...
- Angular系列教程之变更检测与性能优化
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 基于AHB_BUS的eFlash控制器设计-01
基于AHB-BUS的eflash控制器设计 SRAMC是单周期的读写,控制比较简单,没有状态机也没有软硬件的协同 eflash是非易失性的存储器,可以进行读写擦除,它也是一个基于AHB_slave的模 ...
- js - 使用 scroll属性手撸轮播图 —— 无缝连接,更丝滑
上效果图: 上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...