Итак, Res
- это последовательность, которая содержит строки из вашей первой таблицы.Я не имею понятия, что такое Res
, поэтому давайте определим, что один элемент является Re
.
Если у вас есть последовательность элементов, и вы хотите сгруппировать их в группы элементов, которыеесть что-то общее, вы используете Enumerable.GroupBy .Если ваша последовательность находится в базе данных, и вы используете для этого инфраструктуру сущностей, вы должны использовать Queryable.GroupBy
.Синтаксис аналогичен
GroupBy имеет параметр KeySelector
, который определяет, какие свойства должны иметь общие группы.Он также имеет селектор результата: он выбирает, что должна содержать каждая группа.
var groupedItems = res.GroupBy(re => re => new
// KeySelector: what should the elements of a group have in common
// = make groups of Res with same RateCardId, RateCardName, ..., MdmChannelCallLetters
{
Id = re.RateCardId,
Name = re.RateCardName,
Description = re.RateCardDescription,
...
MdmChannel = re.MdmChannelCallLetters,
},
// ResultSelector: take the Key (= what do they have in common,
// and all Res that have these values for key
// to make one new object:
(key, resWithThisKey) => new
{
RateCardId = key.Id,
RateCardName = key.Name,
...
MdmChannelCallLetters = key.MdmChannel,
// You want to concatenate the user names:
UserNames = String.Join(',', resWithThisKey.Select(re => re.UserName)),
});
Перегрузка GroupBy с параметром ElementSelector
, где вы можете определить элементы, которые должны быть в вашей группе.Это упрощает ваш ResultSelector:
var result = res.GroupBy( // KeySelector: see above
// ElementSelector: what should the elements of each group be?
// in your case: you want a group of UserNames
re => re.UserName,
// ResultSelector, similar as above, but now the elements of a group are the userNames
(key, userNames) => new
{
RateCardId = key.Id,
...
UserNames = String.Join('c', userNames),
});