2012-01-31 66 views
3

我正在尝试编写一个LINQ表达式,该表达式将以类似于使用MySql的GROUP_CONCAT的可能格式连接两个表并返回数据。我尝试在Google和SO上搜索,但是我发现使用MSSQL的所有结果或仅使用一个表。我现在写的表达式如下所示:加入两个表并使用LINQ将多个记录作为一行返回

from d in division 
join o in office on d.Id = o.DivisionId 
select new 
{ 
    id = d.Id, 
    cell = new string[] { d.DivisionName, o.OfficeName } 
} 

正如预期的那样,这将返回每个部门和对应于该部门的办公室什么的清单。唯一的问题是,由于大多数部门将有不止一个办公室,我在该部门的每个办公室都设立了一个部门。基本上我看到的结果是这样的:

Division1: Office1 
Division1: Office2 
Division1: Office3 
Division2: Office1 

当我想看看:

Division1: Office1, Office2, Office3 
Division2: Office1  

我记得做一些前一阵子与MySQL所使用GROUP_CONCAT,但我想不出什么这相当于使用LINQ。我试着编写一个参数为IEnumerable<Office>的方法,并使用Aggregate扩展方法构建了一个字符串,但现在我写入了LINQ表达式,每个Office都被传入,而不是IEnumerable<Office>。有没有更好的方法来解决这个问题,而不是我现在正在做的事情?我对LINQ表达式很陌生,所以我很抱歉,如果这是微不足道的。

回答

2

您想要群组加入,例如,

from d in division 
join o in office on d.Id = o.DivisionId into offices 
select new 
{ 
    id = d.Id, 
    divisionName = d.DivisionName, 
    officeNames = offices.Select(o => o.OfficeName) 
} 
+1

哇,约翰Skeet。谢谢回复。我现在正在尝试,我会告诉你它是如何工作的。 – Zajn 2012-01-31 21:02:02

+0

这在LINQ Pad中非常有用。它也适用于我的代码,但不是返回实际的OfficeName,而是返回一个'System.Linq.Enumerable + WhereSelectEnumerableIterator'。我认为这是我在处理从LINQ表达式返回的值时的一个错误。 – Zajn 2012-01-31 21:19:54

+0

@Zajn:你可能想用'officeNames = offices.Select(o => o.OfficeName).ToList()'或类似的东西 - 很难说不知道你在做什么。无论如何,迭代办公室名称应该工作。 – 2012-01-31 21:22:34

相关问题