2012-05-14 75 views
0

我想寫一個查詢來查找組中的一個項目,按行業和重量分組,然後從這個我必須得到的地方重量是最大和平衡是馬克斯太 這是例子:Linq:從其他羣組中選擇第一個項目

var data = new[] { 
new {ID = 1, Industry = 2, Weight = 2, Balance = 500}, 
new {ID = 2, Industry = 2, Weight = 2, Balance = 300}, 
new {ID = 3, Industry = 2, Weight = 1, Balance = 100}, 
new {ID = 5, Industry = 4, Weight = 1, Balance = 100}, 
new {ID = 6, Industry = 4, Weight = 2, Balance = 150}, 
new {ID = 7, Industry = 4, Weight = 1, Balance = 300}, 
}; 

var res = from a in data group a by new {a.Industry, a.Weight} into g 
let ID = g.First().ID 
let Balance = g.Max(a => a.Balance) 
select new { ID, g.Key.Industry, g.Key.Weight, Balance}; 
Console.WriteLine(res); 

因此,作爲結果,我應該得到的只是兩個記錄

ID Industry Weight Balance 
1  2   2  500 
6  4   2  150 

但上面的查詢我得到了4條 有什麼建議?

問候, 德米特里

+2

你打算如何獲得ID 4?它甚至不存在。你會得到4條記錄,因爲有4種工業和重量的組合。 –

+0

對不起,是的。第二項應該是 Id = 6,行業= 4,權重= 2,餘額= 150 – user1394373

+1

您誤解了分組的工作方式。你是由兩個字段組成的。鑑於數據,這兩個領域有四種不同的組合,所以你會得到四個組(因此四個記錄)。阿爾賓展示了你如何獲得這兩個期望的記錄。否則,你如何解釋它,這是沒有道理的。 –

回答

0

可能有許多不同的解決方案,但一個是隻組由工業和根據你的「第一要素挑」的標準,然後從中挑選在每個第一項各組排序組。

var res = from item in data 
    group item by item.Industry into g 
    let first = g.OrderByDescending(x => x.Weight) 
        .ThenByDescending(x => x.Balance).First() 
    select first; 
+0

謝謝,Albin!這是我需要的。 – user1394373

0
data.GroupBy(x=>new {x.Industry,x.Weight}) 
    .ToDictionary(y=>y.Key,y=>y.ToList().Max(x=>x.Balance)); 

如果你不想要一本字典,那麼你可以和選擇一個新的DTO或動態對象,如下所示:

data.GroupBy(x=>new {x.Industry,x.Weight}) 
    .Select(x=>new {x.Key.Industry,x.Key.Weight,x.ToList().Max(y=>y.Balance)}); 

希望這是你所需要的。

+0

謝謝!但它返回了4個項目,但我只需要兩個 – user1394373

+0

它必然返回4,如問題註釋中所討論的那樣。如果您只想使用2,請使用(2)? – Baz1nga

相關問題