2012-01-31 2 views
3

Я пытаюсь написать выражение LINQ, которое объединит две таблицы и вернет данные в формате, аналогичном тому, что возможно с помощью GROUP_CONCAT MySql. Я пробовал искать в 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

Whoa, _the_ John Skeet. Спасибо за ответ. Я пробую это прямо сейчас, и я дам вам знать, как это работает. – Zajn

+0

Это прекрасно работает в LINQ Pad. Он также работает в моем коде, но вместо того, чтобы возвращать фактическое имя OfficeN, он возвращает 'System.Linq.Enumerable + WhereSelectEnumerableIterator'. Я думаю, что это моя ошибка в том, как я обрабатываю значения, возвращаемые из выражения LINQ. – Zajn

+0

@ Zajn: Вы можете использовать 'officeNames = office.Select (o => o.OfficeName) .ToList()' или что-то в этом роде - трудно сказать, не зная больше о том, что вы делаете. Итерация над названиями офисов должна работать в любом случае. –