2013-10-21 76 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