FreeSql使用WithSql+ ToSQL 查询数据

FreeSql是一个支持.NET Core 2.1+、.NET Framework 4.0+ 以及 Xamarin的ORM(Object Relational Mapping)对象关系映射的组件

支持丰富的表达式函数及类型映射,但还是有不少开发者需要执行自定义SQL。

我一般会推荐他们使用
List<T> list = fsql.Ado.Query<T>("select * from t1");
等类似的操作,IAdo下有大量的ADO.NET基础的调用操作。但开发者还想使用类似Page,Skip,OrderBy等方法。鉴于fsql可以生成SQL,可以将不同的SQL组合,实现更加复杂的功能。

  • 引用包

dotnet add packages FreeSql
dotnet add packages FreeSql.Provider.Sqlite
  • .NET Core 单例 Startup.cs

public void ConfigureServices(IServiceCollection services)
{IFreeSql fsql = new FreeSql.FreeSqlBuilder().UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=db1.db").UseAutoSyncStructure(true) //自动同步实体结构到数据库,FreeSql不会扫描程序集,只有CRUD时才会生成表。.Build();services.AddSingleton<IFreeSql>(fsql);
}

可使用以下方式实现

WithSql 自定义SQL

定义实体类

public class TestClass{[Column(Name = "ID", IsPrimary = true)]public string No { get; set; }public int? Age { get; set; }public string Name { get; set; }[Column(Name = "BIRTH_DAY")]public DateTime? Birthday { get; set; }public decimal Point { get; set; }public Sex? Sex { get; set; }}public class TestClssDto{public string ID { get; set; }public int? Age { get; set; }}

不同的查询方式。

  • 返回DataTable

  • 返回List<Tuplue> 即List<(string,string)>元组

  • 返回List<object> 且能支持分页

  • 返回List<TestClassDto>且能支持分页

1.返回DataTable

DataTable dt1 = _fsql.Select<object>().WithSql("select * from TestClass ").ToDataTable("ID,Age");
SELECT ID,Age FROM(select * from TestClass  ) a

2.返回DataTable

DataTable dt2 = _fsql.Select<object>().WithSql("select * from TestClass ").ToDataTable("*");
SELECT * 
FROM ( select * from TestClass  ) a

3.返回List<Tuplue> 即List<(string,string)> 元组

List<(string,string)> list1 = _fsql.Select<object>().WithSql("select * from TestClass ").ToList<(string, string)>("ID,Age");
SELECT ID, AgeFROM(select * from TestClass  ) a

4.返回List<object>

var list2 = _fsql.Select<object>().WithSql("select * from TestClass ").ToList<object>("*");
SELECT *FROM(select * from TestClass  ) a

5.返回List<object> 且能支持分页

var list3 = _fsql.Select<object>().WithSql("select * from TestClass ").WhereIf(true, "1=1").Page(1, 10).OrderBy("ID DESC").ToList<object>("ID,Age");
SELECT ID, AgeFROM(select * from TestClass  ) aWHERE(1 = 1)ORDER BY ID DESClimit 0,10

6.返回List<TestClassDto>且能支持分页

var list4 = _fsql.Select<object>().WithSql("select * from TestClass ").WhereIf(true, "1=1").Page(1, 10).OrderBy("ID DESC").ToList<TestClssDto>("ID,Age");
SELECT ID, AgeFROM(select * from TestClass  ) aWHERE(1 = 1)ORDER BY ID DESClimit 0,10

通过 WithSql+ ToSQL实现 Union ALL 查询方法

1、二次 ISelect 查询:WithSql 使用多次,等于 UNION ALL 查询

WithSql 使用多次为 UNION ALL 查询,所以我们可以利用 ISelect.ToSql(FieldAliasOptions.AsProperty) 得到生成的 SQL,如下:

var sql1 = fsql.Select<Topic>().Where(a => a.Title.Contains("xxx")).ToSql();
var sql2 = fsql.Select<Topic>().Where(a => a.Title.Contains("yyy")).ToSql();fsql.Select<Topic>().WithSql(sql1).WithSql(sql2).ToList();
SELECT  * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` 
FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE ((a.`Title`) LIKE '%xxx%') ) a) ftbUNION ALLSELECT  * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` 
FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE ((a.`Title`) LIKE '%yyy%') ) a) ftb

2、跨分表查询:AsTable 相同实体多次操作,等于 Union ALL 查询

var sql = fsql.Select<User>().AsTable((type, oldname) => "table_1")a.AsTable((type, oldname) => "table_2").ToSql(a => a.Id);
select * from (SELECT a."Id" as1 FROM "table_1" a) ftb 
UNION ALL
select * from (SELECT a."Id" as1 FROM "table_2" a) ftb

3、利用 ToSql 拼接新的 SQL,使用 IAdo 执行

var sql1 = fsql.Select<Topic>().Where(a => a.Id > 100 && a.Id < 200).ToSql(a => new { a.Id, a.Title }, FieldAliasOptions.AsProperty);
var sql2 = fsql.Select<Topic>().Where(a => a.Id > 1001 && a.Id < 1200).ToSql(a => new { a.Id, a.Title }, FieldAliasOptions.AsProperty);fsql.Ado.CommandFluent($"{sql1} UNION ALL {sql2}").ExecuteDataTable();

分页问题

Union All 之后 如果直接 分页会有一个问题。请看具体示例

多次WithSql+Page存在问题:每个WithSql内都有一个Page分页

var sql1 = fsql.Select<Topic>().Where(a => a.Title.Contains("xxx")).ToSql();
var sql2 = fsql.Select<Topic>().Where(a => a.Title.Contains("yyy")).ToSql();fsql.Select<Topic>().WithSql(sql1).WithSql(sql2).Page(1, 20).ToList();
SELECT  * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` 
FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE ((a.`Title`) LIKE '%xxx%') ) a 
limit 0,20) ftbUNION ALLSELECT  * from (SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` 
FROM ( SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime` FROM `tb_topic` a WHERE ((a.`Title`) LIKE '%yyy%') ) a 
limit 0,20) ftb

多个sql union all使用withsql,直接Page分页,会导致每个子表都生效,子表都生成分页。

WithSql 可以和 AsTable 实现分表的功能。

分表跨表查询的时候,分页是要向每个子表(即每个WithSql中的SQL分页)都生效。

解决方案

多次withsql,如需分页,需要按下面的二步操作

  • 第一步:通过witsql,将二个sql组成一个sql。

var sql = fsql.Select<Topic>().WithSql("SELECT * FROM tb_topic where id > 11").WithSql("SELECT * FROM tb_topic where id < 10").ToSql("*")

如上生成的UOION ALL的sql

SELECT  * from (SELECT * FROM ( SELECT * FROM tb_topic where id > 11 ) a) ftbUNION ALLSELECT  * from (SELECT * FROM ( SELECT * FROM tb_topic where id < 10 ) a) ftb
  • 第二步:之后 调用Page则是通过Union ALL后的结果上分页

var sql2 = g.mysql.Select<Topic>().WithSql(sql).Page(2, 10).ToSql();
SELECT a.`Id`, a.`Clicks`, a.`TypeGuid`, a.`Title`, a.`CreateTime`
FROM ( SELECT  * from (SELECT *FROM ( SELECT * FROM tb_topic where id > 11 ) a) ftbUNION ALLSELECT  * from (SELECT *FROM ( SELECT * FROM tb_topic where id < 10 ) a) ftb ) a 
limit 10,10

更多

  • 参考官网http://freesql.net/guide/getting-started.html

  • GitHubhttps://github.com/dotnetcore/FreeSql/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux makefile 教程

网上转帖&#xff1a;http://blog.csdn.net/liang13664759/article/details/1771246 最近在学习Linux下的C编程&#xff0c;买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊&#xff0c;可能是我的理解能不行。于是google到了以下这篇文章。通俗易懂。然后把它贴…

50种奇妙装置玩法,将STEM教育一网打尽

▲数据汪特别推荐点击上图进入玩酷屋致砖《小小机器人》套装全新首发电动机械的完美结合先来看看视频过过眼瘾吧来自美国STEAM教育让孩子跨学科学知识积木向来是STEAM教育很重要的一部分&#xff0c;因为它涉及到了多种学科&#xff1a;要搭建得稳固——这是工程学&#xff1b;…

ubuntu php7.4,在Ubuntu 18.04/19.04/16.04版本上安装PHP 7.4的简单方法

以下介绍安装PHP 7.4的方法非常的简单&#xff0c;适用于Ubuntu 18.04/19.04/16.04版本上&#xff0c;所安装的版本是PHP 7.4.0 RC1&#xff0c;只需要添加PHP ppa存储库并运行相关命令即可完成安装。一、添加PHP ppa存储库我们将添加ppa:ondrej/php PPA存储库&#xff0c;它具…

通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载...

在上一篇文章里&#xff0c;我们通过注入sentinel component到apigateway实现了对下游服务的保护&#xff0c;不过受限于目前变更component需要人工的重新注入配置以及重启应用更新component等等原因&#xff0c;对于真实的环境运维稍有难度&#xff0c;最近我根据sentinel-gol…

NASA成立寻找外星人小组,三全水饺回应猪瘟,微波炉+葡萄=爆炸,94年故宫首次晚间开放,这就是今天的大新闻!...

元宵节刚刚过完汤圆也吃了好几碗是时候来回忆下发生了什么下面是今天的大新闻报&#xff01;故宫网站崩了&#xff0c;被众多人“围攻”&#xff01; &#xff08;搜狐新闻&#xff09;此前&#xff0c;故宫94年来首开夜场”的消息刷屏了&#xff01;故宫将在正月十五、十六开夜…

wpf 可以取消的单选checkbox

利用radioButton的groupName分组互斥。。再解决radiobutton的取消选择的问题。给radiobutton加了一个像checkbox的样式 2个方式&#xff1a; 效果图 第一种usecontrol&#xff1a; xaml&#xff1a; View Code <RadioButton x:Class"GEMS.Windows.Controls.UserContro…

信号与系统matlab课设报告,MATLAB信号与系统实验报告

《MATLAB信号与系统实验报告》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《MATLAB信号与系统实验报告(9页珍藏版)》请在装配图网上搜索。1、信号与系统实验报告(5)MATLAB综合实验项目二 连续系统的频域分析目的周期信号输入连续系统的响应可用傅里叶级数分析。由于…

WeihanLi.Npoi 1.18.0 Released

WeihanLi.Npoi 1.18.0 ReleasedIntro前段时间一直在想&#xff0c;把现在的配置做成类似于 AutoMapper 和 FluentValidation 那样&#xff0c;把每个类型的 mapping 配置放在一个类中&#xff0c;这样我们就可以比较好地组织我们的 mapping 关系&#xff0c;也可以配置多个 map…

表格高亮

引用&#xff1a;http://blog.163.com/ms8712126/blog/static/1899099120122934023200/ //js实现隔行变色window.οnlοadfunction(){var otaldocument.getElementById("otable");for(var i0; i<otal.rows.length; i){ if(i%20){ otal.rows[i].className"e…

大数据人工智能时代,这个行业终于爆发了!

全世界只有3.14 % 的人关注了数据与算法之美这个冬天的程序员可谓是受到了心理和生理上的双重折磨&#xff0c;不仅天气冷&#xff0c;寒冬还见了鬼一样的笼罩着互联网&#xff01;正如老话所说&#xff0c;哪有稳定的工作&#xff0c;只有稳定的能力。这个冬天上午还在改bug下…

Java连续获取两个输入,java 获取控制台的输入的两个方法

链接里面写了两种http://blog.csdn.net/songylwq/article/details/7714622第三种&#xff1a;public class GcdLcm{public static void main(String []args){if(args.length<2){System.out.println("Please input two number...");System.exit(0);}int mInteger.p…

弃码而去

题图来自溪源2017年拍摄的照片。弃码而去1那是2015年的一天。下午5点40&#xff0c;我收拾完手头上的工作&#xff0c;准备关机回家时&#xff0c;qq上突然弹出的窗口吸引了我的注意。“源哥&#xff0c;我能跟你聊一下么&#xff1f;”我点开一看&#xff0c;发现给我发消息的…

Linux虚拟文件系统(VFS)

文件系统是操作系统里非常重要的一个子系统。虚拟文件系统&#xff0c;顾名思义。它为应用程序员提供一层抽象&#xff0c;屏蔽底层各种文件系统的差异。Linux的文件系统采用面向对象的方式设计&#xff0c;这使得Linux的文件系统非常容易扩展&#xff0c;我们可以非常容易将一…

config.php开启redis,微擎如何开启redis,redis开启方法详解

资源来源网络&#xff0c;如果需要授权&#xff0c;请大家更换源码&#xff0c;模块仅供学习&#xff0c;如需商用请购买正版授权&#xff0c;本栏目不提供技术服务&#xff0c;积分不够请签到&#xff0c;或者会员中心投稿源码一、使用5G云宝塔定制版的很多问微信怎么开启redi…

对不起,你被裁了

全世界只有3.14 % 的人关注了数据与算法之美在这互联网高速发展的时代新词层出不穷不过说到造词能力中国肯定是当仁不让的就连裁员这件事都能玩出花来今天数据汪就给大家普普及一下那些关于“裁员”的黑话美团美团外卖&#xff0c;裁员真快不久前&#xff0c;有美团员工在脉脉上…

c#爬虫-使用ChromeDriver 所见即所得

问题最近在做爬虫的时候发现很多网页都是浏览器看得见&#xff0c;但是源文件是看不到的&#xff0c;也就是所谓的异步加载。这时候如果我们需要那些异步内容&#xff0c;要么是了解他的规则&#xff0c;进行条件的组合进而再次进行http请求&#xff0c;得到数据&#xff1b;这…

使用Ext.grid.Panel显示远程数据

使用Ext.grid.Panel显示远程数据 对于Ext.grid.Panel而言&#xff0c;它只是负责显示Store数组中心的数据&#xff0c;至于Store保存的数据到底是浏览器本地数据&#xff0c;还是远程服务器的数据&#xff0c;Ext.grid.Panel并不关心。因此&#xff0c;使用Ext.grid.Panel显示远…

4-8岁那些最难的数学概念,美国老师用一套绘本让孩子秒懂

▲数据汪特别推荐点击上图进入玩酷屋在美国&#xff0c;有不少数学故事类的绘本&#xff0c;小木今天推荐的这套《Math is categorical》就经常被美国老师用于课堂的教学&#xff0c;亚马逊的评价也是接近5星的好评。下面这个5星评价就是来自于一位美国老师&#xff0c;她就说学…

php cbd架构,CBD模式

# CBD模式[上一页](# "上一页")[下一页](# "下一页")ThinkPHP从3.0版本开始引入了全新的**CBD(核心Core行为Behavior驱动Driver)**架构模式&#xff0c;因为从底层开始&#xff0c;框架就采用核心行为驱动的架构体系&#xff0c;核心保留了最关键的部分&am…

WPF 读取Docx文件并显示(附下载链接)

在wpf中直接显示Docx文件 &#xff0c;直接看看效果吧&#xff1a;下面直接看代码&#xff0c;添加主要有两个类&#xff1a;DocxReader类&#xff1a;using System; using System.IO; using System.IO.Packaging; using System.Xml;namespace WpfEmbeddedDocx {class DocxRead…