2016-05-31 30 views
0

我想在我的项目之一中使用Linq.Js。问题是,我必须应用分组,然后在某些列上使用总和并选择某些列的第一个。 例如分组并获取FirstOrDefault LINQ.js

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

结果将是 组上的B A,和采取的第一个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(); 

但它不工作。

回答

0

问题是,你不应该传递任何东西到FirstOrDefault()方法。那里的参数是用来选择第一项的谓词,它不是选择器。只需参加小组的第一场并获得c财产。

你可以编写这样的查询:

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

嘿@jeff,它的作品。还有一个问题,如果我们在执行分组后可以做一些计算,我们可以在同一个查询中完成。例如我们得到了以上输出a:2,b:10,c:1 a:7,b:3,c:2 a:4,b:2,c:5。现在对于每个行项目,如果我们想检查c> 3,那么执行C * b作为d else,它将是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 – Rajesh