【问题标题】:How to create one collection by combining data from two collections?如何通过组合来自两个集合的数据来创建一个集合?
【发布时间】:2020-07-06 11:30:45
【问题描述】:

我第一次尝试使用 SQL 进行数据库尝试。我希望数据库保存一个用户表。每个用户都有 UserName、FirstName、LastName 等属性,但也有一个 Role。 Role 与 User 表中的外键相连。

List<User>users = new List<User>()
users.add(UserId = 1, UserName = "John" UserRoleId=1);
users.add(UserId = 2, UserName = "Luke" UserRoleId=2);
users.add(UserId = 3, UserName = "Marc" UserRoleId=3);
users.add(UserId = 4, UserName = "Mathew" UserRoleId=3);

List<UserRole>userRoles = new <UserRole>userRoles();
userRoles.add(UserRoleId = 1 , UserRole = "Admin");
userRoles.add(UserRoleId = 2 , UserRole = "Project Manager");
userRoles.add(UserRoleId = 3 , UserRole = "Planner");

我想创建一个名为 displayUser 的新对象列表,其中包含 UserRole。 所以结果应该是这样的。

UserId=1, UserName = "John", UserRole = "Admin"
UserId=2, UserName = "Luke", UserRole = "Project Manager"
UserId=3, UserName = "Marc", UserRole = "Planner"
UserId=4, UserName = "Mathew", UserRole = "Planner"

所以一般的问题是:我如何轻松地创建一个集合,结合来自两个集合的数据?

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    join 表并从这两个表创建投影。

    var q = from u in users
            join r in userRoles on u.UserRoleId equals r.UserRoleId 
            select new { u.UserId, u.UserName, r.UserRole };
    

    如果一个用户有多个角色,并且您希望为每个用户收集角色的集合,您可以使用 GroupJoin

    【讨论】:

      【解决方案2】:

      您可以将 LINQ 与这样的连接一起使用:

      List<User> users = new List<User>();
      
      users.Add(new User { UserId = 1, UserName = "John", UserRoleId = 1 });
      users.Add(new User { UserId = 2, UserName = "Luke", UserRoleId = 2 });
      users.Add(new User { UserId = 3, UserName = "Marc", UserRoleId = 3 });
      users.Add(new User { UserId = 4, UserName = "Mathew", UserRoleId = 3 });
      
      List<UserRole> userRoles = new List<UserRole>();
      
      userRoles.Add(new UserRole { UserRoleId = 1, UserRoleName = "Admin" });
      userRoles.Add(new UserRole { UserRoleId = 2, UserRoleName = "Project Manager" });
      userRoles.Add(new UserRole { UserRoleId = 3, UserRoleName = "Planner" });
      
      var result = from user in users
                   join userRole in userRoles on user.UserRoleId equals userRole.UserRoleId
                   select new
                   {
                     user.UserId,
                     user.UserName,
                     userRole.UserRoleName
                   };
      
      foreach ( var item in result )
        Console.WriteLine($"{item.UserId}, {item.UserName}, {item.UserRoleName}");
      

      它从由角色 id 连接的两个列表中选择项目,并根据需要创建新的命名和键入项目。

      结果查询可以转换为List&lt;(int, string, string)&gt;

      var list = result.ToList();
      

      输出

      1, John, Admin
      2, Luke, Project Manager
      3, Marc, Planner
      4, Mathew, Planner
      

      【讨论】:

        猜你喜欢
        • 2013-04-26
        • 1970-01-01
        • 2017-02-17
        • 2021-11-04
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 2019-07-14
        • 2014-02-06
        相关资源
        最近更新 更多