摘要
FreeSql是一个充满活力的ORM框架,支持.NET Core 2.1、.NET Framework 4.0和Xamarin。它可以帮助我们轻松地进行关系型数据库操作,让我们的开发更加高效。
正文
FreeSql应用WithSql ToSQL 查看数据信息
[FreeSql](https://GitHub.com/dotnetcore/freesql)是一个适用.NET Core 2.1 、.NET Framework 4.0 及其 Xamarin的ORM(Object Relational Mapping)目标关联投射的部件
适用丰富多彩的关系式涵数及种类投射,但或是有许多开发人员必须实行自定SQL。
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
界定dao层
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, Age
FROM(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, Age
FROM(select * from TestClass ) a
WHERE(1 = 1)
ORDER BY ID DESC
limit 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, Age
FROM(select * from TestClass ) a
WHERE(1 = 1)
ORDER BY ID DESC
limit 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) ftb
UNION ALL
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 '%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) ftb
UNION ALL
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 '%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) ftb
UNION ALL
SELECT * 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) ftb
UNION ALL
SELECT * 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/
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0