2014-12-03 65 views
0

我想從表中選擇行。我需要在一列上執行GroupBy,然後在不同的列上執行Distinct()。我想返回結果中的整個行。如何使用Lambda返回不同行的分組數組

假設一個數據庫表具有以下結構和數據:

GroupId = 1, To = "A", From = "B", Flag = True 
GroupId = 1, To = "A", From = "C", Flag = True 
GroupId = 1, To = "B", From = "A", Flag = True 
GroupId = 1, To = "B", From = "C", Flag = False 
GroupId = 1, To = "C", From = "A", Flag = True 
GroupId = 1, To = "C", From = "B", Flag = True 
GroupId = 2, To = "A", From = "B", Flag = True 
GroupId = 2, To = "B", From = "C", Flag = True 
GroupId = 2, To = "C", From = "A", Flag = True 
GroupId = 2, To = "D", From = "C", Flag = True 
GroupId = 2, To = "D", From = "A", Flag = False 
GroupId = 2, To = "A", From = "B", Flag = True 

下面的代碼行返回組的陣列與每個含To字符串數組:

var test = db.LookupMap 
    .Where(u => u.Flag == true) 
    .GroupBy(u => u.GroupId, (key, group) => group.Select(m => m.To).Distinct()) 
    .ToArray(); 

我可以通過將m.To更改爲m獲取一組對象:

.GroupBy(u => u.GroupId, (key, group) => group.Select(m => m).Distinct()) 

但是這會打破「收件人」列上的Distinct()。

如何返回對象數組(整行)而不是數組字符串?

注意:要列應爲唯一的GroupId不同

回答

1

使用另一個GroupByFirst結合:

.GroupBy(u => u.GroupId, 
     (key, group) => group.GroupBy(m => m.To).Select(g => g.First())) 

這組項目,而不使用To屬性值第一組,然後進行第一個項目從每一個內部組。這是從moreLINQ獲得相當於DistinctBy方法的最簡單方法 - 獲取整行,但Distinct應該只在一個屬性值上運行。

+0

您的解決方案效果很好!我很難打破這一行代碼。它有效,但我不明白它是如何做到的。謝謝。 – rwkiii 2014-12-03 07:39:57

+0

我添加了一些更多的描述。希望能幫助到你。 – MarcinJuraszek 2014-12-03 07:43:07