сгруппировать по linq с объединить столбцы - PullRequest
0 голосов
/ 20 марта 2019

У меня есть Объект с такими данными ниже

enter image description here

Я ищу результаты, подобные этому

enter image description here

Для этого я пытаюсь с запросом linq ниже

 var results = (from l in res 
            group new
            {
                l.MDMChannelCallLetters,
                l.UserName,
                l.IsActive,
                l.IsLocal,
                l.IsNetwork,
                l.IsPrivate,                 
                l.RatecardDescription,
                l.RatecardName,
            } by l.RatecardId into g select new
            {
                // I am not sure what i need to do 

            } )

Может ли кто-нибудь помочь в этом, как объединить только определенные значения столбца с разделенными запятыми), имеющие одинаковый идентификатор с помощью linq Query

Заранее большое спасибо !!!

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Вы должны сначала сгруппировать его по общим свойствам:

 var grouped = res.GroupBy(c => new {
      c.RatecardId,
      c.RatecardName,
      c.RatecardDescription,
      IsActive,
      IsPrivate,
      IsLocal,
      IsNetwork
 });

А затем вам нужно выбрать ваш конечный результат.Как то так:

var results = grouped.Select(c => new {
     c.Key.RatecardId,
     c.Key.RatecardName,
     c.Key.RatecardDescription,
     c.Key.IsActive,
     c.Key.IsPrivate,
     c.Key.IsLocal,
     c.Key.IsNetwork,
     MDMChannelCallLetters = string.Join(", ", c.Select(x => x.MDMChannelCallLetters)),
     UserName = string.Join(", ", c.Select(x => x.UserName))
});
0 голосов
/ 21 марта 2019

Итак, 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),
   });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...