2016-05-31 55 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