SqlSugar的Select用法
Select 位置
正常情况:应该在最后面, 一般是 .Where(..).OrderBy(..).Select(..).ToList()
特殊情况:如果Select不是最后一个位置,则Select要加MergeTable()合并成一个表, Select(...).MergeTable().Where
语法糖:
Select(...).MergeTable() 在新版本中可以用SelectMergeTable(it=>new xxx(){xx}).Where
返回一个字段和多个字段
List< int > listInt=db.Queryable<Student>().Select(it => it.Id).ToList(); //返回一个字段 DataTable list=db.Queryable<Student>().Select(it => new { id=it.Id,name=it.Name}).ToDataTable(); //2个字段 List<Class1>list=db.Queryable<Student>().Select(it => new Class1{id=it.Id,name=it.Name}).ToList(); //2个字段 List<dynamic>list=db.Queryable<Student>().Select(it =>(dynamic) new {id=it.Id,name=it.Name}).ToList(); //2个字段 //动态 List< int > listInt=db.Queryable<Student>().Select< int >( "id" ).ToList(); List<Order> listInt=db.Queryable<Student>().Select<ViewModel>( "id as id, name as name" ).ToList(); |
单表返回DTO
//返回匿名对象 var dynamic = db.Queryable<Student>().Select<dynamic>().ToList(); //Select * from Student //手动:返回匿名集合 支持跨程序集 List<dynamic> dynamicList = db.Queryable<Student>().Select(it=>(dynamic) new { id=it.id}).ToList(); //Select id as id from Student Select只有一列所以只查一列 //手动:返回匿名集合 不能跨程序集用 var dynamic = db.Queryable<Student>().Select(it=> new { id=it.id}).ToList(); //手动:返回类集合-手动 List<Student> list= db.Queryable<Student>().Select(it=> new Student{ id=it.id}).ToList(); //Select id as id from Student Select只有一列所以只查一列 //自动返回DTO集合: 请升级 5.1.3.2 var listDto= db.Queryable<Student>().Select<StudentDto>().ToList(); //返回List //自动返回DTO : 请升级 5.1.3.35 var listDto= db.Queryable<Student>() .Select(it=> new StudentDto() { Count=100 //手动指定一列在自动映射 }, true ) //true表式开启自动映射 .ToList(); //返回List |
多表返回DTO
手动DTO
var newClass= db.Queryable<Student, School, DataTestInfo>((st, sc, di) => new JoinQueryInfos( JoinType.Left, st.SchoolId == sc.Id, JoinType.Left, st.Name == di.String )) .Select((st,sc,di)=> new ClassName{ name=st.Name,scid=sc.Id }) //看这一行就行了 .ToList(); //实体转换 //指定了2列只查2列 //select st.name as name , sc.id as scid |
想要自动看下面
实体自动映射1
语法最美,新功能(5.1.3.35)
var list4=db.Queryable<SchoolA>() .LeftJoin<StudentA>((x, y) => (x.SchoolId == y.SchoolId)) .Select((x,y) => new UnitView01() { Name=x.SchoolName, Count=100 }, true ) //true表示 其余字段自动映射,根据字段名字 .ToList(); |
生成的Sql如下:
SELECT [x].[ID] AS [id] , --自动 [x].[ Time ] AS [ Time ] , --自动 [x].[SchoolName] AS [ Name ] --手动 100 as [ Count ] --手动 FROM [SchoolA] x Left JOIN StudentA y ON ( [x].[SchoolId] =[y].[SchoolId]) |
实体自动映射2
说明:通过x.*方式实现多表查询
//生成的SQL为 Select o.*, [c].[Name] AS [CustomName] var oneClass = db.Queryable<Order>() .LeftJoin<OrderItem>((o,i)=>o.Id == i.OrderId) .LeftJoin<Custom>((o,i,c)=>o.CustomId == c.Id) .Where(o=>o.Id>1) .Select((o,i,c)=> new ViewOrder // 是一个新类 { //Id是o任意一个属性 Id=o.Id.SelectAll(), // 等于 o.* (SelectAll建议用一张表,多表会容易重名) CustomName=c.Name // 等于 [c].[Name] AS [CustomName] }).ToList() |
生成Sql如下
SELECT o.*, [c].[ Name ] AS [CustomName] FROM [ Order ] o Left JOIN [OrderItem] i ON ( [o].[Id] = [i].[OrderId] ) Left JOIN [Custom] c ON ( [o].[CustomId] = [c].[Id] ) WHERE [o].[Id]>1 |
实体自动映射3
说明:通过约束实现自动映射
比如一个3表查询 Order 、 OrderItem、Custom
需要注意的是 Select用的是自动填充这样使用方便,高并发的地方还是写成上面那种方式(5.0.5.2性能优化提升)
public class ViewOrder { public string Name { get ; set ; } // ORDER表中的name 主表规则【字段名】 public string CustomName { get ; set ; } //查询的是Custom中的的name 从表规则【class+字段名】 public string OrderItemPrice { get ; set ; } //查询的是OrderItem中的name 从表规则【 class+字段名】 } var viewModel= db.Queryable<Order>() .LeftJoin<OrderItem>((o,i)=>o.Id == i.OrderId) .LeftJoin<Custom>((o,i,c)=>o.CustomId == c.Id) .Select<ViewOrder>().ToList(); |
sql:
SELECT o.[ Name ] AS [ Name ], c.[ Name ] AS [CustomName], i.[Price] AS [OrderItemPrice] FROM [ Order ] o Left JOIN [OrderItem] i ON ( [o].[Id] = [i].[OrderId] ) Left JOIN [Custom] c ON ( [o].[CustomId] = [c].[Id] ) |
注意:
1.ViewOrder必须每个列都能匹配到字段,否则就无法按规则匹配,保证每个列都正确
2.高并发功能不建议使用,手写的性能肯定高于自动映射
匿名对象自动映射
说明:自动主表赋值 表.*
.Select<dynamic>((st,sc)=> new { //id是st任意一个属性 id=st.Id.SelectAll(), // st.* (SelectAll建议只用一张表,不然查询列会有重名) SchoolName=sc.Name // Name as SchoolName }).ToList() //Select st.*,[sc].[Name] AS [schoolName] //.SelectAll等同于SqlFunc.GetSelfAndAutoFill是个语法糖 |
创建DTO类
这样就能快速拿到DTO类的实体字符串比手写要快的多
string classtring=db.Qureyable<Order>().Select(....).ToClassString( "命名空间" ); |
多表查一表
var oneClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos( JoinType.Left, o.Id == i.OrderId, JoinType.Left, o.CustomId == c.Id )) .Select((o, i, c) => c).ToList(); |
多表返回2表
var twoClass = db.Queryable<Order, OrderItem, Custom>((o, i, c) => new JoinQueryInfos( JoinType.Left, o.Id == i.OrderId, JoinType.Left, o.CustomId == c.Id )) .Select((o, i, c) => new { o,i}).ToList() |
双查询结果用法
当我们需要在select后在外面在包一层select,代码如下
var getAll = db.Queryable<Order>() .Select(it => new Order { Id = it.Id * 2, Name = it.Name }) .MergeTable() //将上面的操作变成一个表 mergetable .GroupBy(it => it.Id) //对表mergetable进行分组 .Select(it => new { id=it.Id }).ToList(); //查询mergetable表里面的字段 //SELECT `Id` FROM // ( SELECT // ( `Id` * @Id0 ) AS `Id` , // `Name` AS `Name` // // FROM `Order ) MergeTable // GROUP BY `Id` // 参数 @Id0:2 |
Select之后对字段进行C#处理
方式1 (5.1.4.113-preview+)
只能返回string只能是个单参数
public class UnitTool { public static string GetName( string name) //定义一个string { return "name" + 111; } } //获取methodInfo var methodInfo = typeof (UnitTool).GetMethod( "GetName" ); var list8 = db.Queryable<Order>() .Select(it => new { n = it.Name, name = SqlFunc.OnlyInSelectConvertToString(it.Name, methodInfo) //只能是select中用 }).ToList(); |
方式2
相对方式1用法麻烦 支持的功能全些
实体类
var list= db.Queryable<Order>().Select(it=> new Order{ Id=it.Id, Name=it.Name }) .Mapper(it => { //只能写在Select后面 it.Name = it.Id + it.Name; //相当于ToList循环赋值 }).ToList(); |
匿名对象
var list = db.Queryable<Order>().Select(it=> (dynamic) new //转成 dynamic { Id=it.Id, Name=it.Name }) .Mapper(it => { //只能写在Select后面 it.Name = it.Id + it.Name; //相当于ToList循环赋值 }).ToList(); |
注意:(dynamic)不要漏了
返回全表并附加其他字段
.Select<dynamic>(u => new
{
Id = u.Id.SelectAll(),
ChildrenCount = SqlFunc.Subqueryable<SysDictData>().Where(a => a.DictTypeId == u.Id).Count()
})
动态Select
//方式1:多库兼容 var selector= new List<SelectModel>() { new SelectModel(){AsName = "id1" ,FiledName = "id" }, new SelectModel(){ FiledName = "id" }}; var list=db.Queryable<Order>()..Select(selector).ToList(); //更多复杂用法:https://www.donet5.com/Home/Doc?typeId=2421 //SELECT `id` AS `id1` , `id` AS `id` FROM `Order` //方式2:直接写SQL var list=db.Queryable<Order>().Select( "ID AS id1,id as id" ).ToList(); //方式3: 动态表达式 StaticConfig.DynamicExpressionParserType = typeof (DynamicExpressionParser); //启动时配置 var list= db.Queryable<Order>().Select( "it" , $ "it=>new(it.Id as Id, it.Name)" , typeof (Order)).ToList(); //需要SqlFunc:https://www.donet5.com/Home/Doc?typeId=2569 |
别名AS用法
Select(it=> new { id1=it.id ,name2 =it.name }) //select id as id1,name as name2 |
如果是动态看 上面一个标题
返回元组
版本:5.1.4.84+
List<( int Id, string Name)> list = db.Queryable<Order>().Select<( int Id, string Name)>( "id,name" ).ToList(); |
过滤某一个字段
/***单表***/ db.Queryable<Order>().IgnoreColumns(it=>it.Files).ToList(); //只支持单表查询 /***联查***/ //是主表 var leftQuery=db.Queryable<Order>().IgnoreColumns(it=>it.Files); var list=db.Queryable(leftQuery).LeftJoin<OrderDetails>((o,d)=>o.id==d.orderid).Select(o=>o).ToList(); //是Join的表 var rightQuery= db.Queryable<OrderItem>().IgnoreColumns(it=>it.Files); var list=db.Queryable<Order>().LeftJoin(rightQuery,(o,d)=>o.Id == d.OrderId).Select(o=>o).ToList(); |
SqlSugar的Select用法的更多相关文章
- html select用法总结
本文将介绍select 原生的常用方法,这些都是经过测试,兼容ie6到ie10,及chrome,火狐等,也就是说大部分浏览器都兼容.如果大家发现有不兼容的情况,可以跟我留言. 我们对基本的用法了如指掌 ...
- 网络通信 --> select()用法
select()用法 头文件 #include <sys/time.h> #include <sys/types.h> #include <unistd.h> 定义 ...
- python+selenium七:下拉框、选项框、select用法
# from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsimpo ...
- golang学习之select用法
早期的select函数是用来监控一系列的文件句柄,一旦其中一个文件句柄发生IO操作,该select调用就会被返回.golang在语言级别直接支持select,用于处理异步IO问题. select用法同 ...
- 数据库Oracle的select用法(部分)
Oracle的select用法(部分): 1.查询所有: select * from employees; 2.加上where子句:用选择限制行 select * from employees whe ...
- 每天玩转3分钟 MyBatis-Plus - 6. select 用法
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 每天玩转3分钟 MyBatis-Plus - 3. 高级查询(一) 每天玩转 ...
- select用法&原理详解(源码剖析)(转)
今天遇到了在select()前后fd_set的变化问题,查了好久终于找到一个有用的帖子了,很赞,很详细!!原文链接如下: select用法&原理详解(源码剖析) 我的问题是: 如下图示:在se ...
- select用法
每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了. 比如<select class="selector"></select&g ...
- shell编程中的select用法
select 语句 select表达式是bash的一种扩展应用,擅长于交互式场合.用户可以从一组不同的值中进行选择: select var in ... ; do break; done .... n ...
- 非阻塞式socket的select()用法
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只 是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程 ...
随机推荐
- Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包
Jenkins Pipeline 流水线 步骤 拉取SVN代码 -> Maven 构建 -> Docker 编译 -> 发布至阿里云仓库 -> K8S 更新 Jenkins插件 ...
- You are not using binary logging
Error Code : 1381You are not using binary logging show variables like '%log_bin%'; 在mysqld配置项下面加上log ...
- 利用GetPrivateProfileString相关函数读取配置文件(.ini)
配置文件中经常用到ini文件,在VC中其函数分别为: 写入.ini文件: bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyN ...
- PS 创建网络去掉反冲增强
一.当物料为反冲物料时,创建网络数据,希望去掉反冲标识 二.增强实施 在BAPI中传入反冲标识为空 在标准代码中发现反冲标识的赋值位置 判断当不传入反冲标识,将物料自带的反冲标识清空 定期更文,欢迎关 ...
- 一个含不少免费额度和数据下载的IP地址来源查询工具
大家好,我是TJ君! 如今在国内运营的各种互联网应用都有接入IP来源显示的要求,现在相关API的供应商也很多.今天TJ刚好看到一个不错的,所以马上给大家推荐一下. 这款不错的产品名称为:IPInfo ...
- .net 温故知新【17】:Asp.Net Core WebAPI 中间件
一.前言 到这篇文章为止,关于.NET "温故知新"系列的基础知识就完结了,从这一系列的系统回顾和再学习,对于.NET core.ASP.NET CORE又有了一个新的认识. 不光 ...
- 聊聊与前端工程师天然互补的 Serverless
作者:灵轮_(阿里云前端技术专家)_ 作为前端工程师,我们的使命是为用户提供良好的前端用户体验.随着云原生时代的到来,显而易见的,我们能做的更多了.Serverless 产品的特点是免运维.按量付费和 ...
- 你真的懂Linux内核中的阻塞和异步通知机制吗?
@ 目录 阻塞/非阻塞简介 阻塞/非阻塞例程 等待队列简介 等待队列相关函数 定义等待队列 初始化等待队列头 定义并初始化一个等待队列项 将队列项添加到等待队列头 将队列项从等待队列头移除 等待唤醒 ...
- 洛谷 P9916 「RiOI-03」Just a Q. (Easy ver.) 题解
前言 Div.2 Rank \(13\) 获奖了,题目也好评. 解法 题目链接:\(\color{Purple}\texttt{P9916「RiOI-03」Just a Q. (Easy ver.)} ...
- 【日常踩坑】Debug 从入门到入土
写代码难免遇到 bug,调试解决 bug 的快慢很影响开发的效率.本文主要是梳理并记录下个人经常用的调试方法(主要以 C/C++ 的 segment fault 为例) 分类 根据调试时机与 bug ...