简体   繁体   English

LINQ-层次数据中的列总和

[英]LINQ - sum of column in hierarchical data

My data looks like this: 我的数据如下所示:

样本数据

I am trying to create a JSON ouput (using JSON .NET) which will have the sum of the Value column by levels. 我正在尝试创建一个JSON输出(使用JSON .NET),该输出将具有按级别划分的Value列的总和。

For example: 例如:

{
'id': 'AB',
'sum': '53', 
'level2' : [
   {
     'id' : 'CD',
     'sum' : '23',
     'level3' : [
        {
          'id' : 'd1',
          'sum' : '12'
        }, 
        {
          'id' : 'd2',
          'sum' : '11'
        }
      ]
...

I am trying to use LINQ to create this. 我正在尝试使用LINQ来创建它。 So far I have the following code: 到目前为止,我有以下代码:

var query = reader.SelectRows(r => new
    {
        level1 = r["level1"].ToString(),
        sum = r["sum"] != DBNull.Value ? Convert.ToDouble(r["sum"]) : 0,
        level2 = new
        {
            level2 = r["level2"].ToString(),
            sum = r["sum "] != DBNull.Value ? Convert.ToDouble(r["sum"]) : 0,
            level3 = new
            {
                level3 = r["level3 "].ToString(),
                sum = r["sum"] != DBNull.Value ? Convert.ToDouble(r["sum"]) : 0
            }
        }
    })
        .GroupBy(r => new { r.level1 })
        .Select(g => new
        {
            id = g.Key.level1,
            sum = g.Sum(x => x.sum),
            level2 = g.GroupBy(l => new { l.level2.level2 })
            .Select(l => new
            {
                id = l.Key.level2,
                sum = g.Sum(y => y.sum),
                level3 = l.GroupBy(m => new { m.level2.level3.level3 })
                .Select(m => new
                {
                    id = m.Key.level3,
                    sum = g.Sum(z => z.sum),
                })
            })
        });

retJSON = JsonConvert.SerializeObject(new { data = query }, Formatting.Indented);

The SelectRows function is like this: SelectRows函数如下所示:

// Adapted from this answer https://stackoverflow.com/a/1202973
// To https://stackoverflow.com/questions/1202935/convert-rows-from-a-data-reader-into-typed-results
// By https://stackoverflow.com/users/3043/joel-coehoorn
public static IEnumerable<T> SelectRows<T>(this IDataReader reader, Func<IDataRecord, T> select)
{
    while (reader.Read())
    {
        yield return select(reader);
    }
}

However, I am getting sum repeated at every level, ie the same value. 但是,我得到的总和在每个级别都重复,即相同的值。 Any direction on how to achieve this will be greatly appreciated. 如何实现这一目标的任何方向将不胜感激。

I think your query is nearly there just 2 changes (shown by comments below). 我认为您的查询几乎只有2次更改(如下面的注释所示)。

.GroupBy(r => new { r.level1 })
    .Select(g => new
    {
        id = g.Key.level1,
        sum = g.Sum(x => x.sum),
        level2 = g.GroupBy(l => new { l.level2.level2 })
        .Select(l => new
        {
            id = l.Key.level2,
            sum = l.Sum(y => y.sum), //l not g
            level3 = l.GroupBy(m => new { m.level2.level3.level3 })
            .Select(m => new
            {
                id = m.Key.level3,
                sum = m.Sum(z => z.sum), //m not g
            })
        })
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM