【问题标题】:Linq query syntax equivalent group by id having sum(amount) > x amountLinq 查询语法等效组按 id 总和(数量)> x 数量
【发布时间】:2020-11-01 22:27:04
【问题描述】:

我的示例中有一个像这样的数据表(真实的比下面的列多几列):

Id             Amount
1              2
12             4
12             6
22             7
22             7

我需要按 Sum(Amount) > 5 的 ID 进行分组,如下所示:

Id             Amount
12             10
22             14

我首先使用 GroupBy,然后将组投影到 DataRows,然后使用 CopyToDataTable 扩展创建 DataTable。而且效果很好。

我是这个 Linq 方法和查询语法的新手,您能否告诉我,除了下面的现有查询之外,我可以在哪里添加子句 HAVING SUM(Amount) > 5?

以下是我的查询:

var newDt = dt.AsEnumerable()
              .GroupBy(r => r.Field<int>("Id"))
              .Select(g =>
              {
                  var row = dt.NewRow();

                  row["Id"] = g.Key;
                  row["Amount"] = g.Sum(r => r.Field<int>("Amount"));

                  return row;
              }).CopyToDataTable();

【问题讨论】:

    标签: linq


    【解决方案1】:

    这里有两种实现方式:

    var newDt = dt.AsEnumerable()
        .GroupBy(r => r.Field<int>("Id"))
        .Select(r =>
        {
            var row = dt.NewRow();
            row["Id"] = r.Key;
            row["Amount"] = r.Sum(x => x.Field<int>("Amount"));
            return row;
        })
        .Where(r => r.Field<int>("Amount") > 5)
        .OrderBy(r => r.Field<int>("Id"))
        .CopyToDataTable();
    

    var newDt = dt.AsEnumerable()
        .GroupBy(r => r.Field<int>("Id"))
        .Where(r => r.Sum(x => x.Field<int>("Amount")) > 5)
        .Select(r =>
        {
            var row = dt.NewRow();
            row["Id"] = r.Key;
            row["Amount"] = r.Sum(x => x.Field<int>("Amount"));
            return row;
        })
        .OrderBy(r => r.Field<int>("Id"))
        .CopyToDataTable();
    

    【讨论】:

    • 亲爱的 Carlo Bos, 感谢您为我的问题提供解决方案。你能解释一下你的查询顺序吗?我看到你已经把另一个 Select 语句方法?只是一个额外的问题,如果我想 OrderBy Id,OrderBy 方法应该放在哪里?
    • 我已经更新了我的答案以一直使用数据表行,从而消除了使用可枚举对象和两个Select 语句的需要。我还添加了OrderBy 来显示它的去向。
    • 非常感谢您的帮助,卡洛。祝你有美好的一天!
    • 您好 Carlos,很抱歉就同一问题再次打扰您。我很好奇您的查询,GroupBy 和 Select 之间可以放置 Where 方法吗?这样做有什么影响?希望你不介意回答这个问题
    • 是的,绝对是,但是在创建将被过滤掉的行或进行两次聚合总和计算之间将是一个折腾。上面的答案更容易阅读理解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多