前言

  FreeSql支持通过Sql语句配合ISelect生成最终的Sql语句,也可以执行原生自定义Sql语句,使操作更灵活;通过sql语句与Iselect配合使用更好控制sql语句;

简单查询

_freeSql.Select<Student>()
.WithSql(@"SELECT TOP 10 * FROM dbo.Student
WHERE Age > 5 AND Status = 1
ORDER BY Age DESC")
.ToList(); SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT TOP 10 * FROM dbo.Student
WHERE Age > 5 AND Status = 1
ORDER BY Age DESC ) a //指定字段
_freeSql.Select<Student>()
.WithSql(@"SELECT TOP 10 * FROM dbo.Student
WHERE Age > 5 AND Status = 1
ORDER BY Age DESC")
.ToList<object>("Name,Age");
SELECT Name,Age
FROM ( SELECT TOP 10 * FROM dbo.Student
WHERE Age > 5 AND Status = 1
ORDER BY Age DESC ) a
  
  当只需要各别字段时,需要将字段卸载Tolist()中,而非WithSql,WithSql中的sql语句会被包起来作为一个表,如果外层(Tolist中的字段)查询内层(WithSql中的字段)没有字段会报错
  以下是错误示例
_freeSql.Select<Student>()
.WithSql(@"SELECT TOP 10 Nmae,Age FROM dbo.Student
WHERE Age > 5 AND Status = 1
ORDER BY Age DESC")
.ToList("Id,Name");
SELECT a.[Id], a.[Name]
FROM ( SELECT TOP 10 Nmae,Age FROM dbo.Student
WHERE Age > 5 AND Status = 1
ORDER BY Age DESC ) a
 
 

分页

_freeSql.Select<Student>()
.WithSql(@"SELECT * FROM dbo.Student")
.WhereIf(true, "Age > 5")
.OrderBy(x => x.Age)
.Page(2, 10)
.ToList();
//SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
//FROM(SELECT * FROM dbo.Student) a
//WHERE(Age > 5)
//ORDER BY a.[Age]
//OFFSET 10 ROW
//FETCH NEXT 10 ROW ONLY
 
 

Union All

  FreeSql提供WithSql生成Union All查询,多个WithSql组合在一起会用Union All拼接,从而实现Union All
var sql1 = _freeSql.Select<Student>()
.WithSql(@"SELECT * FROM dbo.Student WHERE ClassId=1")
.ToSql();
//SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
//FROM(SELECT * FROM dbo.Student WHERE ClassId = 1) a
var sql2 = _freeSql.Select<Student>()
.WithSql(@"SELECT * FROM dbo.Student WHERE ClassId=2")
.ToSql();
//SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
//FROM(SELECT * FROM dbo.Student WHERE ClassId = 2) a //合并
_freeSql.Select<Student>()
.WithSql(sql1)
.WithSql(sql2)
.ToList();
//SELECT* from(SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
//FROM (SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
// FROM (SELECT* FROM dbo.Student WHERE ClassId= 1) a ) a) ftb //UNION ALL //SELECT* from(SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
//FROM (SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
// FROM (SELECT* FROM dbo.Student WHERE ClassId= 2) a ) a) ftb
 

拼接sql结果集

  利用ToSql拼接新的SQL,将ToSql后获得的sql语句使用IAdo执行,可以实现多个sql语句的拼接,最后使用ado执行sql,以union all为例
var sql3 = _freeSql.Select<Student>()
.WithSql(@"SELECT * FROM dbo.Student WHERE ClassId=1")
.ToSql();
var sql4 = _freeSql.Select<Student>()
.WithSql(@"SELECT * FROM dbo.Student WHERE ClassId=2")
.ToSql();
_freeSql.Ado.CommandFluent($"{sql3} UNION ALL {sql4}")
.ExecuteDataTable();
// SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
//FROM(SELECT * FROM dbo.Student WHERE ClassId = 1) a UNION ALL SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
//FROM(SELECT * FROM dbo.Student WHERE ClassId = 2) a

分页坑

  当有两个sql语句,使用WithSql拼接两个sql或使用Page分页会导致两个sql都被加上了分页
var sql5 = _freeSql.Select<Student>()
.WithSql(@"SELECT * FROM dbo.Student WHERE ClassId=1")
.ToSql();
var sql6 = _freeSql.Select<Student>()
.WithSql(@"SELECT * FROM dbo.Student WHERE ClassId=2")
.ToSql();
var sql7 = _freeSql.Select<Student>()
.WithSql(sql1)
.WithSql(sql2)
.Page(1, 10)
.ToSql(); SELECT * from (SELECT TOP 10 a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT * FROM dbo.Student WHERE ClassId=1 ) a ) a) ftb UNION ALL SELECT * from (SELECT TOP 10 a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT * FROM dbo.Student WHERE ClassId=2 ) a ) a) ftb

  

  可以看到在sql7生成的时候使用了Page(1,10),导致sql查询的时候添加了Top 10,而且两条查询语句都添加了!

  官方提供的解决方案是先将sql5和sql6先不分页生成sql7,最终执行的sql7的时候再分页,这样就能正确拼接两条sql语句再分页;

var sql7 = _freeSql.Select<Student>()
.WithSql(sql1)
.WithSql(sql2)
.ToSql();
_freeSql.Select<Student>()
.WithSql(sql7)
.Page(2, 10)
.ToList();
SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT * from (SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT * FROM dbo.Student WHERE ClassId=1 ) a ) a) ftb UNION ALL SELECT * from (SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT a.[Id], a.[Name], a.[Age], a.[Status], a.[AddTime], a.[Remark], a.[Version], a.[ClassId]
FROM ( SELECT * FROM dbo.Student WHERE ClassId=2 ) a ) a) ftb ) a
ORDER BY a.[Id]
OFFSET 10 ROW
FETCH NEXT 10 ROW ONLY

FreeSql学习笔记——12.执行Sql的更多相关文章

  1. CUBRID学习笔记 28 执行sql脚本文件

    一下命令在csql下执行. insert_commands.sql为sql脚本文件 ;CL ;READ insert_commands.sql ;RU 第一行的cl 清空命令缓存,等同clear第二行 ...

  2. Mybatis学习笔记12 - 动态sql之choose(when otherwise)标签

    choose (when, otherwise):分支选择:带了break的swtich-case 示例代码: 接口定义: package com.mybatis.dao; import com.my ...

  3. SQL反模式学习笔记12 存储图片或其他多媒体大文件

    目标:存储图片或其他多媒体大文件 反模式:图片存储在数据库外的文件系统中,数据库表中存储文件的对应的路径和名称. 缺点:     1.文件不支持Delete操作.使用SQL语句删除一条记录时,对应的文 ...

  4. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  5. 并发编程学习笔记(12)----Fork/Join框架

    1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...

  6. SpringMVC:学习笔记(12)——ThreadLocal实现会话共享

    SpringMVC:学习笔记(12)——ThreadLocal实现会话共享 ThreadLocal ThreadLocal,被称为线程局部变量.在并发编程的情况下,使用ThreadLocal创建的变量 ...

  7. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

  8. Ext.Net学习笔记12:Ext.Net GridPanel Filter用法

    Ext.Net学习笔记12:Ext.Net GridPanel Filter用法 Ext.Net GridPanel的用法在上一篇中已经介绍过,这篇笔记讲介绍Filter的用法. Filter是用来过 ...

  9. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  10. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

随机推荐

  1. Blazor 组件库 BootstrapBlazor 中Button组件介绍

    组件介绍 按钮组件,应该是最基础的组件之一了.感觉没什么可介绍的,但是BootstrapBlazor的按钮,还是有很多不错的特性. 首先是最基础的,boostrap5的按钮样式: 代码如下: < ...

  2. Electron(2) - 下载与解压缩

    1.下载文件 主线程中调用下载 win.webContents.downloadURL(url) 监听下载事件 //监听下载动作 win.webContents.session.on('will-do ...

  3. Java和.Net互相使用RSA加密时的问题和处理方法

    前言 我们产品是使用JAVA语言开发的,有个供第三方获取Token的接口,过程大概就是第三方先调一个注册接口,获取一个RSA公钥,然后用通过公钥加密后的一些认证信息调用获取Token的接口,如果信息无 ...

  4. 【Amadeus原创】域用户完美执行应用程序

    企业环境中,为了安全起见一般都没有赋予域用户或者企业的PC客户端用户管理员权限. 但偶尔会有个别的程序一定需要管理员身份才能执行,如财务某些程序或专业的应用程序.那么如何不赋予用户管理员权限及密码但又 ...

  5. 【前端】【样式】CSS居中的三种方式

    @charset "utf-8"; /* CSS Document */ /** *开发者:萌狼蓝天 *当前版本:v0.1[Debug] *最后更新日期:20210918 **/ ...

  6. Promise/A+ 规范 - 中文版本

    Promises/A+ 这是一个开放标准,旨在让不同开发者实现的 JavaScript Promise 能够无缝衔接并应用--由前辈们制定,为其他后来者提供参考 一个 promise 所表示的是异步操 ...

  7. 『玩转Streamlit』--上传下载文件

    在Web应用中,文件的上传下载是交互中不可缺少的功能. 因为在业务功能中,一般不会只有文字的交互,资料或图片的获取和分发是很常见的需求. 比如,文件上传可让用户向服务器提交数据,如上传图片分享生活.提 ...

  8. Linux 管理面板云帮手、APPNODE与宝塔哪个好

    阿里云服务器推荐购买99元 由于用作服务器的 Linux 主机通常都没有图形化界面,与日常使用的 Windows .MAC有着很大的差别,一些必备组件的安装或更新就很费时间,后期维护也费神.服务器管理 ...

  9. Qt音视频开发44-本地摄像头推流(支持分辨率/帧率等设置/实时性极高)

    一.前言 本地摄像头推流和本地桌面推流类似,无非就是采集的设备源头换成了本地摄像头设备而不是桌面,其他代码完全一样.采集本地摄像头实时视频要注意的是如果设置分辨率和帧率,一定要是设备本身就支持的,如果 ...

  10. CDS标准视图:催款冻结 I_DunningBlockingReasonCode

    视图名称:催款冻结 I_DunningBlockingReasonCode 视图类型:基础视图 视图代码: 点击查看代码 @EndUserText.label: 'Dunning Blocking R ...