2013-10-21 124 views
0

我有一個數據表,看起來像返回Groupedby不同LINQ值

Agency   | Contact   | Group 
Agency1   person1   lunch runners 
Agency1   person1   band 
Agency1   person3   basketball 
Agency2   person4   band 

,我想通過代理它們分組,然後由聯繫人姓名。我曾嘗試過使用LINQ 50種不同的方法,但碰壁了。有人可以點亮一下嗎?謝謝。

+0

什麼是您的預期輸出? – Habib

+0

你能展示你最好的嘗試嗎? –

+0

你的意思是代理機構*,然後是合同名稱*?這聽起來像點菜! – Alireza

回答

2

使用匿名類型:

var groups = table.AsEnumerable() 
    .GroupBy(r => new 
     { 
      Agency = r.Field<string>("Agency"), 
      Contact = r.Field<string>("Contact") 
     }); 

foreach (var agencyContactGroup in groups) 
    Console.WriteLine("Agency: {0} Contact: {1} Groups: {2} Count: {3}" 
     , agencyContactGroup.Key.Agency 
     , agencyContactGroup.Key.Contact 
     , string.Join(",", agencyContactGroup.Select(r => r.Field<string>("Group"))) 
     , agencyContactGroup.Count()); 

輸出與樣品數據:

Agency: Agency1 Contact: person1 Groups: lunch runners,band Count: 2 
Agency: Agency1 Contact: person3 Groups: basketball   Count: 1 
Agency: Agency2 Contact: person4 Groups: band    Count: 1 
+0

使用foreach,我將如何將這些添加到數據表? – jpavlov

+0

我綁定到一個數據表的中繼器。 – jpavlov

+0

您無法輕易從IEnumerable 派生'DataTable'。但是查詢所期望的結果是什麼?如果你想從每個組中取一個特定的行,你可以用'CopyToDataTable'創建一個新表。否則,你可以創建一個'List '。您也可以直接將此匿名類型用作'Repeater'的'DataSource'。如果我沒有記錯,你需要一個集合,所以最後使用'ToList()'。 –

0

collection.GroupBy(x => new { x.Agency, x.Contact })應該這樣做。這將創建一個用於密鑰的匿名對象。

請注意,您必須將此一般想法應用到@TimSchmelter的答案中的DataTable中。

如果需要組的層次結構(即Agency1組有一個PERSON1組內),你可以這樣做:

collection.GroupBy(x => x.Agency).Select(x => x.GroupBy(y => y.Contact)); 
+0

我不認爲這是對問題的正確解釋。您按代理機構將聯繫人姓名分組,然後按代理機構分組,然後按聯繫人姓名分組。 – Zong

+0

@宗正立我做了一個修改,以解決你的評論。 –

0
var results = db.<EntityCollection> 
    .ToLookup(a => a.Agency) 
    .ToDictionary(lu => lu.Key, lu => lu.ToLookup(lui => lui.Contact)); 

然後可以訪問,如下所示:

results[<agencyName>][<contactName>] 
+0

這是一個對羣組進行分組的算法。將它應用於您的意願 – Moho