Я пытаюсь написать выражение 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, поэтому прошу прощения, если это тривиально.
Whoa, _the_ John Skeet. Спасибо за ответ. Я пробую это прямо сейчас, и я дам вам знать, как это работает. – Zajn
Это прекрасно работает в LINQ Pad. Он также работает в моем коде, но вместо того, чтобы возвращать фактическое имя OfficeN, он возвращает 'System.Linq.Enumerable + WhereSelectEnumerableIterator'. Я думаю, что это моя ошибка в том, как я обрабатываю значения, возвращаемые из выражения LINQ. – Zajn
@ Zajn: Вы можете использовать 'officeNames = office.Select (o => o.OfficeName) .ToList()' или что-то в этом роде - трудно сказать, не зная больше о том, что вы делаете. Итерация над названиями офисов должна работать в любом случае. –