【问题标题】:Grouping multiple records in one single record将多条记录分组到一条记录中
【发布时间】:2017-09-04 09:47:58
【问题描述】:

我有两门课 -

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; }
}

我在 MyUser 中以 .net 列表的形式获取记录-

 |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

现在我想把它转换成 FinalUsers

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

不确定如何在 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
   }

我确定上面的查询是不正确的,请你帮我改正它。或者提出另一种实现结果的方法。

【问题讨论】:

    标签: c# .net linq linq-to-entities


    【解决方案1】:

    我认为问题出在您的group by 声明中:

       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()
       }
    

    另外值得一提的是,你的类的结构有多余的信息,比如:用户的名字和姓氏,用户的电子邮件,组名和角色名,你最好为用户信息,组信息制作不同的类,和角色信息。

    【讨论】:

    • 它在编译时失败 - 错误 CS1061 'IGrouping' 不包含 'RoleId' 的定义并且没有扩展方法 'RoleId' 接受类型为 'IGrouping' 可以找到(您是否缺少 using 指令或程序集引用?)
    • 在分配 gcs.RoleId, gcs.RoleName, gcs.GroupId, gcs.GroupName 时抛出错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2017-02-24
    • 2019-02-18
    • 2018-01-17
    • 1970-01-01
    • 2020-09-30
    • 2020-05-10
    相关资源
    最近更新 更多