【问题标题】:Grouping and get FirstOrDefault LINQ.js分组并获取 FirstOrDefault LINQ.js
【发布时间】:2016-05-31 07:22:19
【问题描述】:

我正在尝试在我的一个项目中使用 Linq.Js。问题是我必须应用分组,然后在某些列上使用 sum 并选择某些列中的第一个。 例如

var list = [
           { a: 2, b: 4, c: 1 },
           { a: 2, b: 3, c: 7 },
           { a: 2, b: 3, c: 3 },
           { a: 4, b: 7, c: 5 },
           { a: 7, b: 3, c: 2 },
           { a: 4, b: 1, c: 5 }]; 

结果将是 在 a 上分组,b 的总和并取 c 中的第一个

a:2,b:10,c:1
a:7,b:3,c:2
a:4,b:1,c:5

到现在我都试过了,

var aggregatedObject = Enumerable.From(claimForCalculation)
               .GroupBy("$.a", null,
                 function (key, g) {
                     var result = {
                         groupedKey: key,
                         chargedQty: g.Sum("$.b"),
                         chargedRate: g.FirstOrDefault("$.c"),
                     }
                     return result;
                 }, function (x) {  return x }).ToArray();

但它不起作用。

【问题讨论】:

    标签: jquery linq.js


    【解决方案1】:

    问题是你不应该向FirstOrDefault() 方法传递任何东西。那里的参数是用于选择第一项的谓词,它不是选择器。只需获取组中的第一个并获取c 属性。

    你可以这样写你的查询:

    var query = Enumerable.From(list)
        .GroupBy("$.a", null, "{ a: $, b: $$.Sum('$.b'), c: $$.First().c }")
        .ToArray();
    

    【讨论】:

    • 嘿@jeff,它的作品。还有一个问题,如果我想在我们执行分组后做一些计算,我们可以在同一个查询中做。例如我们得到了上面的输出 a:2,b:10,c:1 a:7,b:3,c:2 a:4,b:2,c:5。现在对于每个行项目,如果我们要检查 c > 3 则执行 C * b as d 否则它将是 c。逻辑输出后将为.. a:2,b:10,c:1,d:1 a:7,b:3,c:2,d:2 a:4,b:2,c:5:d :10
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多