2014-12-27 43 views
0

我正在繼續LINQ: Groupby and LastLINQ:組和包括在最終結果中的LET

ID Field1 Field2  Field3 
1 aaaa 20/01/2014 10 
2 aaaa 21/01/2014 3 
3 aaaa 25/01/2014 10 
4 bbbb 01/01/2014 90 
5 bbbb 03/01/2014 10 
6 bbbb 31/01/2014 5 

我想按字段1,抓住基於字段2各組的最古老的行:

基本上我下面的表格了。

我還需要建立一些基於field3的複雜計算(我爲此使用「let」)。 現在我使用Where子句中的「let」。這很好。

我:

var result = from p in Table1 
let MyLet = p.Field3 - 1 //This is actually very complex in the real scenario. 
Where MyLet > 5 
group p by p.Field1 into grp 
select grp.OrderByDescending(g=>g.Field2).First(); 

!如何包括MyLet到最終的結果,所以它看起來像這樣

ID Field1 Field2  Field3 MyLet 
3 aaaa 25/01/2014 10  9 
5 bbbb 03/01/2014 10  9 
+0

'MyLet'是您用於過濾的變量。你究竟想如何取回?你能展示任何樣本輸出嗎? – 2014-12-27 15:18:24

+0

我編輯了這個問題以包含應該看起來像什麼。注:行ID = 6是Field1 = bbbb,BUT中最早的,因爲WHERE子句中的MyLet過濾器「MyLet> 5」此行(ID = 6)不會生成該行。 – danieljaguiar 2014-12-27 15:29:01

回答

2

試試這個: -

var result = from p in fields 
        let MyLet = p.Field3 - 1 
        where MyLet > 5 
        group new { p, MyLet } by p.Field1 into grp 
        let firstField = grp.OrderByDescending(x => x.p.Field2).First() 
        select new 
         { 
          ID = firstField.p.ID, 
          Field1 = firstField.p.Field1, 
          Field2 = firstField.p.Field2, 
          Field3 = firstField.p.Field3, 
          MyLet = firstField.MyLet 
         }; 

請在訪問字段之前考慮檢查空值。

+0

我認爲你釘了它。我正在使用當前答案和前一個答案(編輯之前)的混合。十分感謝! – danieljaguiar 2014-12-27 17:43:02

+0

@danieljaguiar - 最初我對你的要求感到困惑,但後來得到了正確的結果。樂於幫助 :) – 2014-12-27 17:45:16