【问题标题】:LINQ - sum of column in hierarchical dataLINQ - 分层数据中的列总和
【发布时间】:2019-11-26 12:32:42
【问题描述】:

我的数据如下所示:

我正在尝试创建一个 JSON 输出(使用 JSON .NET),它将按级别包含 Value 列的总和。

例如:

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

我正在尝试使用 LINQ 来创建它。到目前为止,我有以下代码:

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

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

但是,我在每个级别都得到 sum 重复,即相同的值。任何有关如何实现这一目标的方向都将不胜感激。

【问题讨论】:

    标签: c# json linq


    【解决方案1】:

    我认为您的查询几乎只有 2 处更改(如下面的 cmets 所示)。

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

    【讨论】:

    • 谢谢!看了将近一个小时,没看到:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多