Freesql 通过WithSQl +ToSQL实现 Union All 查询方法
Withsql 使用多次,相当于Mysql 中的Union All 查询
var sql1=fsql.Select<Dto>().where().tosql();
var sql2=fsql.Select<Dto>().where().tosql();
return fsql.Select<Dto>.withsql(sql1).withSql(sql2).toList()
分页问题
Union All 之后再直接分页 会存在一个问题;
多次的WithSql+Page 会导致 每个WithSQL 内部都有一个Page分页
//分页
var sql1 = fsql.Select<Dto>() .Where().ToSql();
var sql2 = fsql.Select<Dto>() .Where().ToSql();
//Union All:
fsql.Select<Topic>().WithSql(sql1).WithSql(sql2).Page(1, 20).ToList();
SELECT * from (SELECT * FROM ( SELECT * FROM `tb_topic` a WHERE ( ) a limit 0,20) ftb
UNION ALL
SELECT * from (SELECT * FROM ( SELECT * FROM `tb_topic` a WHERE ( ) a limit 0,20) ftb |
考虑到这种情况发生,需要将多个sql 通过WithSql在生成一个sql ,第二步:之后再调用Page则通过Union All后的结果上分页
var htsql=fsql.select<Dto>().tosql();
var htsql1=fsql.select<Dto>().tosql();
var sql=fsql.select<Dto>()
.withSql(htsql)
.WithSql(htsql1).Tosql();
var list=fsql.Select<Dto>().Withsql(sql).Page(1,10).Tolist()
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
其实Freesql 官网有详情信息,关于这种情况也有讲解,所以还是需要我们自己认真研读官方文档