Search code examples
c#.netlinqlinq-to-entities

Grouping multiple records in one single record


I have two classes -

public class MyUser
{
    public string UserID{ get; set; }
    public string UserFirstName{ get; set; }
    public string UserLastName{ get; set; }
    public string UserEmail{ get; set; }
    public string RoleId{ get; set; }
    public string RoleName { get; set; }
    public string GroupId{ get; set; }
    public string GroupName{ get; set; }
}

public class FinalUsers
{
    public string UserID{ get; set; }
    public string UserFirstName{ get; set; }
    public string UserLastName{ get; set; }
    public string UserEmail{ get; set; }
    public List<string> RoleId{ get; set; }
    public List<string> RoleName { get; set; }
    public List<string> GroupId{ get; set; }
    public List<string> GroupName{ get; set; }
}

I am getting records in MyUser as .net list-

 |UserId | UserFirstName | UserLastName | UserEmail  | UserRoleId | UserRoleName | UserGroupId | UserGroupName
 | 1     | Anil          | Surname1     | abc@ab.com | R123       | Read         | NULL        | NULL
 | 1     | Anil          | Surname1     | abc@ab.com | R234       | Write        | NULL        | NULL
 | 1     | Anil          | Surname1     | abc@ab.com | null       | null         | G1          | Group1
 | 1     | Anil          | Surname1     | abc@ab.com | null       | null         | G2          | Group2

Now I want to convert it into FinalUsers

 |UserId | UserFirstName | UserLastName | UserEmail  | UserRoleId | UserRoleName | UserGroupId | UserGroupName
 | 1     | Anil          | Surname1     | abc@ab.com | R123,R234  | Read,Write   | G1,G2       | Group1,Group2

Not sure how to group it in linq -

from p in myUserList
   group p by new
   {
       p.RoleId,
       p.RoleName,
       p.GroupId,
       p.GroupName,
   } into gcs
   select new FinalUsers()
   {
       UserId = gcs.FirstOrDefault().UserId,
       UserFirstName = gcs.FirstOrDefault().UserFirstName ,
       UserLastName = gcs.FirstOrDefault().UserLastName ,
       UserEmail = gcs.FirstOrDefault().UserEmail ,
       RoleId = gcs.RoleId,
       RoleName = gcs.RoleName,
       GroupId= gcs.GroupId,
       GroupName= gcs.GroupName
   }

I am sure the above query is incorrect, could you please help me to correct it. or else suggest another way to achieve result.


Solution

  • I think the problem is in your group by statement:

       from p in myUserList
       group p by p.UserId into gcs
       select new FinalUsers()
       {
           UserId = gcs.Key,
           UserFirstName = gcs.Select(g => g.UserFirstName).First() ,
           UserLastName = gcs.Select(g => g.UserLastName ).First(),
           UserEmail = gcs.Select(g => g.UserEmail).First() ,
           RoleId = gcs.Select(g => g.RoleId).ToList(),
           RoleName = gcs.Select(g => g.RoleName).ToList(),
           GroupId= gcs.Select(g => g.GroupId).ToList(),
           GroupName= gcs.Select(g => g.GroupName).ToList()
       }
    

    It is also worth to mention that your classes' structure has redundant information like: User's first and last names, user's email, group name, and role name, you should better make different classes for users' information , groups' information, and roles information.