前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >union 分页/group/join 复杂查询(.net core/framework)

union 分页/group/join 复杂查询(.net core/framework)

原创
作者头像
用户8604107
修改2021-07-08 14:43:48
6550
修改2021-07-08 14:43:48
举报
文章被收录于专栏:crl .netcrl .net

### union 分页/group/join 复杂查询(.net core/framework)

unoin是一个比较特殊的查询,对union进行分页,关联,分组需要在最外面包装一层,如果对union结果再进行其它关联,分组,复杂度直线上升,解决此问题

1. 安装nuget包:CRL

2. using CRL;

以下为默认数据源实现

如果使用ef core和ado.net 见:[Data/EFTest · hubroxxl/CRL - 码云 - 开源中国 (gitee.com)](https://gitee.com/hubroxxl/crl/tree/master/Data/EFTest)

**定义数据源**

```c#

var builder = DBConfigRegister.GetInstance();

builder.RegisterDBAccessBuild(dbLocation =>

{

return new DBAccessBuild(DBType.MSSQL, "server=.;database=testDb; uid=sa;pwd=123;");

});

```

**定义对象管理器**

```c#

public class ProductRepository:BaseProvider<ProductData>

{

public static ProductRepository Instance

{

get { return new ProductRepository(); }

}

}

```

通过GetLambdaQuery方法创建ILambdaQuery

ILambdaQuery能实现子查询和嵌套查询,只要符合T-SQL语义逻辑,可以使用ILambdaQueryResultSelect无限叠加

如:

- join后group

- join后再join

- group后再join

- join一个group结果

- join一个union结果

- 对union进行group再join

- ...

**简单的union**

```c#

var query = ProductRepository.Instance.GetLambdaQuery().Where(b => b.Id < 200);

var query2 = query.CreateQuery<Code.Order>().Where(b => b.Id < 200);

var view1 = query.Select(b => new { a1 = b.Id, a2 = b.ProductName });

var view2 = query2.Select(b => new { a1 = b.Id, a2 = b.Remark });

var result = view1.Union(view2).OrderBy(b => b.a1).OrderBy(b => b.a2, false).ToList();

var sql = query.PrintQuery();

```

生成SQL为

```sql

select t1.[Id] as a1,t1.[ProductName1] as a2 from [ProductData] t1 with (nolock) where (t1.[Id]<'200')

union all

select t2.[Id] as a1,t2.[Remark] as a2 from [OrderProduct] t2 with (nolock) where (t2.[Id]<'200')

order by [a1] desc,[a2] asc

```

**对union进行分页**

```c#

var query = ProductRepository.Instance.GetLambdaQuery().Where(b => b.Id < 200);

query.Take(10);

var query2 = query.CreateQuery<Code.Order>().Where(b => b.Id < 200).Take(5);

var view1 = query.Select(b => new { a1 = b.Id, a2 = b.ProductName });

var view2 = query2.Select(b => new { a1 = b.Id, a2 = b.Remark });

var union = view1.Union(view2).OrderBy(b => b.a1).OrderBy(b => b.a2, false);

union.UnionPage(15, 1);//分页参数

var result = union.ToList();

var sql = query.PrintQuery();

```

生成SQL为

```sql

SELECT * FROM (select a1,a2,ROW_NUMBER() OVER ( Order by [a1] desc,[a2] asc ) AS RowNumber from (select top 10 t1.[Id] as a1,t1.[ProductName1] as a2 from [ProductData] t1 with (nolock) where (t1.[Id]<200)

union all

select top 5 t2.[Id] as a1,t2.[Remark] as a2 from [OrderProduct] t2 with (nolock) where (t2.[Id]<200)) tu) T WHERE T.RowNumber BETWEEN 1 AND 15 order by RowNumbe

```

**union后再join**

```c#

var query = ProductRepository.Instance.GetLambdaQuery().Where(b => b.Id < 200);

query.Take(10);

var query2 = query.CreateQuery<Code.Order>().Where(b => b.Id < 200).Take(5);

var view1 = query.Select(b => new { a1 = b.Id, a2 = b.ProductName });

var view2 = query2.Select(b => new { a1 = b.Id, a2 = b.Remark });

var union = view2.Union(view1).OrderBy(b => b.a1).OrderBy(b => b.a2, false);

var join = query.Join(union, (a, b) => a.Id == b.a1).Select((a, b) => new { a.Id, b.a2 });//join

var result = join.ToList();

var sql = query.PrintQuery();

```

生成SQL为

```sql

select top 10 t1.[Id],t3.[a2] as a2 from [ProductData] t1 with (nolock) Inner join (select top 5 t2.[Id] as a1,t2.[Remark] as a2 from [OrderProduct] t2 with (nolock) where (t2.[Id]<'200')

union all

select top 10 t1.[Id] as a1,t1.[ProductName1] as a2 from [ProductData] t1 with (nolock) where (t1.[Id]<'200')

order by [a1] desc,[a2] asc) t3 on t1.[Id]=t3.a1 where (t1.[Id]<'200')

```

**union后再group**

```c#

var query = ProductRepository.Instance.GetLambdaQuery().Where(b => b.Id < 200);

var query2 = query.CreateQuery<Code.Order>().Where(b => b.Id < 200);

var view1 = query.Select(b => new { a1 = b.Id, a2 = b.ProductName });

var view2 = query2.Select(b => new { a1 = b.Id, a2 = b.Remark });

var union = view1.Union(view2).OrderBy(b => b.a2, false);

var group = union.UnionGroupBy(b => b.a2);//group

var result = group.Select(b => new { b.a2 }).ToList();

var sql = query.PrintQuery();

```

生成SQL为

```sql

select a2 from (select t1.[Id] as a1,t1.[ProductName1] as a2 from [ProductData] t1 with (nolock) where (t1.[Id]<'200')

union all

select t2.[Id] as a1,t2.[Remark] as a2 from [OrderProduct] t2 with (nolock) where (t2.[Id]<'200')) tu group by a2

order by [a2] asc

```

源码示例参考

[Data/QueryTest/test · hubroxxl/CRL - 码云 - 开源中国 (gitee.com)](https://gitee.com/hubroxxl/crl/tree/master/Data/QueryTest/test)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库一体机 TData
数据库一体机 TData 是融合了高性能计算、热插拔闪存、Infiniband 网络、RDMA 远程直接存取数据的数据库解决方案,为用户提供高可用、易扩展、高性能的数据库服务,适用于 OLAP、 OLTP 以及混合负载等各种应用场景下的极限性能需求,支持 Oracle、SQL Server、MySQL 和 PostgreSQL 等各种主流数据库。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档