union
是一个比较特殊的查询,对union
进行分页,关联,分组需要在最外面包装一层,如果对union
结果再进行其它关联,分组,复杂度直线上升,解决此问题
- 安装
nuget
包:CRL
using CRL;
以下为默认数据源实现 EFTest
定义数据源
var builder = DBConfigRegister.GetInstance();
builder.RegisterDBAccessBuild(dbLocation =>
{
return new DBAccessBuild(DBType.MSSQL, "server=.;database=testDb; uid=sa;pwd=123;");
});
定义对象管理器
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
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
为
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
进行分页
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为
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 RowNumber
union
后再join
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为
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
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为
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