应用场景 :
分组条件是a,b,c,d的任意组合,来自前端,前端选了 a就只分组a,选了 a,b就分组a,b
(select 部分也是来自前端,前端选了 a就只查a,选了 a,b就只查a,b
select a,b,c,d,... from xxx
group by a,b,c,d
以下方法适用于mysql
在mysql中group by 可以不用指定列名,但pgsql必须声明列名。
.GroupBy(x => new
{
O_ID = req.groupParams.djjg == 1 ? x.O_ID : null,
xzqh_id = req.groupParams.ywssqh == 1 ? x.xzqh_id : null,
qllx = req.groupParams.qllx == 1 ? x.qllx : null,
djlx = req.groupParams.djlx == 1 ? x.djlx : null
})
.ToList(x => new Dto
{
djjg = x.Key.O_ID,
djlx = x.Key.djlx,
ywssqh = x.Key.xzqh_id,
qllx = x.Key.qllx,
bjsl = (int)x.Sum(x.Value.bjsl)
});
对上面方法pgsql需要调整:
2024-05-15 调整如下
.GroupBy(x=>new {
a=req.groupParams.a==1?x.a:"a",
b=req.groupParams.b==1?x.b:"b",
c=req.groupParams.c==1?x.c:"c"
}).ToList(x=>new Dto{
a=req.groupParams.a==1?x.Key.a:null,
b=req.groupParams.b==1?x.Key.b:null,
c=req.groupParams.c==1?x.Key.c:null
});
如果有多次groupby,则as的别名和select 别名要能对应,下面例子就是一个groupby三次的动态分组。(注意freesql的参数化)
group by 怎么动态分组? · Discussion #1038 · dotnetcore/FreeSql · GitHub
,欢迎大家讨论(freesql官方Q群:52508226)
GitHub - dotnetcore/FreeSql: 🦄 .NET orm, Mysql orm, Postgresql orm, SqlServer orm, Oracle orm, Sqlite orm, Firebird orm, 达梦 orm, 人大金仓 orm, 神通 orm, 翰高 orm, 南大通用 orm, Click house orm, MsAccess orm.https://github.com/dotnetcore/FreeSqlFreeSql 官方文档FreeSql Documentshttp://freesql.net/