在C#中的LINQ中执行JOIN
本文关键字:执行 JOIN LINQ 中的 | 更新日期: 2023-09-27 18:28:12
我有以下C#代码
List<User> users = User.FindAll();
List<Role> roles = Role.FindAll();
这些是与安全相关的自定义对象。两个对象的属性如下所示:
User Role
---- ----
UserId RoleId
UserName RoleName
RoleIds
我正在尝试创建一个新的User对象,它将为我提供每个用户的RoleId和RoleNames。本质上,我想要一个新的用户对象,它看起来像这样:
User
----
UserId
UserName
Roles (RoleId, RoleName)
我需要记住这一点。目前,我有以下几种:
var results = (from user in users
select new
{
UserId = user.UserId,
UserName = user.UserName,
});
但是,我不知道如何添加Roles
属性,以便只包括与每个用户关联的角色列表。我不知道如何使用roles
变量进行联接。LINQ有办法做到这一点吗?如果是,如何?
使用Where
var results = (from user in users
select new
{
UserId = user.UserId,
UserName = user.UserName,
Roles = roles.Where(r => user.RoleIds.Contains(r.RoleId)).ToList()
});
这假设RoleIds
实际上是一个包含RoleId的数组。如果不是这样,并且它是一个逗号分隔的RoleId字符串,那么您需要首先string.split
它来创建一个角色Id数组,然后Contains
将具有预期的行为(即不匹配"1"answers"10"。
你尝试过这个吗:
创建类
Public Class tblUser
{
public string UserId {get; set;}
public string UserName {get; set;}
public string RoleIds {get; set;}
public string RoleName {get; set;}
}
var results = (from h in users
join n Role on h.RoleIds equal n.RoleId
select new tblUser
{
UserId = h.UserId,
UserName = h.UserName,
RoleName = n.RoleName
}
);
希望它能有所帮助!!!!!!
我的建议是:在数据库中重构用户/角色关系,这样就有了三个表。
User
-----
UserId
UserName
Role
-----
RoleId
RoleName
UsersInRoles
-----
UserId
RoleId
IsActive
然后,在Id列上具有从UsersInRoles到User和从UsersIn Roles到Role的外键关系。然后,当您进行查询时,您可以将所有三个表连接在一起以获得必要的信息,如下所示:
var results = (from u in Users
join uir in UsersInRoles on u.UserId equals uir.UserId
join r in Role on uir.RoleId equals r.RoleId
where uir.IsActive
select new
{
UserId = u.UserId,
UserName = u.UserName,
RoleName = r.RoleName
});