Linq 的自定义聚合方法的有关问题
Linq 的自定义聚合方法的问题。
用 linq 进行 group by 查询, sum() 可以合计数值类型字段,但如果是字符串,我向将字符串都 拼合 起来,怎么做呢?
------------------------------------------------------------------
假设 1 个 DataTable:
dt1
-----------------------------------------
id parent_id amount level
-----------------------------------------
数值型 string 类型
按上级 id 进行统计:
var query = from NewDt in dt.AsEnumerable() group NewDt by NewDt.Field<int>("parent_id") into gg select new { parent_id = gg.Key, amount = gg.Sum(NewDt => NewDt.Field<double>("amount")) };
grid.DataSource = query.AsQueryable();
grid.DataBind();
这个查询,按照 parent_id 统计出来了 sum(amount)。
--------------------------------------------------------------------
但是,我想统计 level 字段,将字符串都 拼合 起来,如何做的?
我想要的结果:
原 DataTable:
-----------------------------------------
id parent_id amount level
-----------------------------------------
1 1 1 abc
2 1 0 xyz
3 2 10 甲乙丙
4 2 9 春秋冬
Linq 查询后的结果:
------------------------------------------
parent_id level
------------------------------------------
1 abcxyz
2 甲乙丙春秋冬
------解决方案--------------------
而且我认为这样最好的方式应该是存储过程先分好组,然后linq直接生成存储过程的
数据库用stuff来很好实现你的level 字段
------解决方案--------------------
用 linq 进行 group by 查询, sum() 可以合计数值类型字段,但如果是字符串,我向将字符串都 拼合 起来,怎么做呢?
------------------------------------------------------------------
假设 1 个 DataTable:
dt1
-----------------------------------------
id parent_id amount level
-----------------------------------------
数值型 string 类型
按上级 id 进行统计:
var query = from NewDt in dt.AsEnumerable() group NewDt by NewDt.Field<int>("parent_id") into gg select new { parent_id = gg.Key, amount = gg.Sum(NewDt => NewDt.Field<double>("amount")) };
grid.DataSource = query.AsQueryable();
grid.DataBind();
这个查询,按照 parent_id 统计出来了 sum(amount)。
--------------------------------------------------------------------
但是,我想统计 level 字段,将字符串都 拼合 起来,如何做的?
我想要的结果:
原 DataTable:
-----------------------------------------
id parent_id amount level
-----------------------------------------
1 1 1 abc
2 1 0 xyz
3 2 10 甲乙丙
4 2 9 春秋冬
Linq 查询后的结果:
------------------------------------------
parent_id level
------------------------------------------
1 abcxyz
2 甲乙丙春秋冬
------解决方案--------------------
而且我认为这样最好的方式应该是存储过程先分好组,然后linq直接生成存储过程的
数据库用stuff来很好实现你的level 字段
------解决方案--------------------
- C# code
var query = from NewDt in dt.AsEnumerable() group NewDt by NewDt.Field<int>("parent_id") into gg select new { parent_id = gg.Key, amount = gg.Sum( r => r.Field<int>("amount") ), level = gg.Concatenate( r => r.Field<string>("level") ) }; static class MyHelper { public static string Concatenate(this IEnumerable<DataRow> source, Func<DataRow, string> selector) { StringBuilder sb = new StringBuilder(); foreach (DataRow row in source) { sb.Append(selector(row)); } return sb.ToString(); } }