用 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                   甲乙丙春秋冬

解决方案 »

  1.   

    select new 里面都带的是gg的方法或者属性,没有合并字符串之类方法,你这样子不好处理,换种思路用StringBulider吧
    比如我根据parent_id把集合出来来后,然后对这个集合进行操作
      

  2.   

    而且我认为这样最好的方式应该是存储过程先分好组,然后linq直接生成存储过程的
    数据库用stuff来很好实现你的level 字段
      

  3.   

    谢谢楼上,但是我的 DataTable 不是数据库中表,是内存中的,接收到某个网站发送过来的 XML 数据,我需要整理好后再写到数据中。如果先把这个 XML 的内容,先保存到临时表,倒是可以试一下你的方法。但如果我上面的能够用 Linq 直接搞定就最好了。
      

  4.   


    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();
        }
    }
      

  5.   

    高手!
    传说 CSDN 高手很多,果不其然!!