我正在尝试填充一个RoleList,它将包含每个用户的角色名称。我在查询部分遇到问题。
我有2个表, IdentityUserRole 表,其中包含 UserId 和 RoleId ,然后是 IdentityRoles 表 RoleId 和角色的名称。
这是我到目前为止所做的,它给了我多个问题。
public static IEnumerable<string> GetRolesByUserId(string userId)
{
ApplicationDbContext db = new ApplicationDbContext();
return db.Set<IdentityUserRole>().Where(r => r.UserId.Contains(userId)).Select(x => x.RoleId);
}
我最终会在此列表中调用GetRolesByUserId
。
private async Task<IEnumerable<UserViewModel>> GetUserData(ApplicationDbContext db)
{
var users = db.Users;
var list = await GetUsers(db, users);
var vmlist = list.Select(item => new UserViewModel()
{
ID = item.ID,
Username = item.Username,
FirstName = item.FirstName,
LastName = item.LastName,
Email = item.Email,
TaxID = item.TaxID,
TaxIdHash = item.TaxIdHash,
IV = item.IV,
TaxIDEncrypted = item.TaxIDEncrypted,
Active = item.Active,
RoleList = GetRolesByUserId(item.ID),
Roles = "",//string.Join(",", GetRolesByUserId(item.ID)).ToArray(),
IsActive = item.IsActive,
Status = item.Status
});
UserViewModel将RoleList作为
public List<string> RoleList { get; set; }
我对c#查询相当新,过去3天一直试图解决这个问题。如果有人可以帮我解决这个问题,请。谢谢。
答案 0 :(得分:1)
关于查询部分,您需要以下内容:
public static List<string> GetRolesByUserId(string userId)
{
var db = new ApplicationDbContext();
var userRoles = from identityUserRole in db.Set<IdentityUserRole>
join identityRole in db.Set<IdentityRoles>
on identityUserRole.RoleId equals identityRole.RoleId
where identityUserRole.UserId == userId
select identityRole.Name;
return userRoles.ToList();
}
以上是另一种声明LINQ查询的语法,它被称为查询语法,而您使用的语法称为流畅语法。最后,编译器会将用查询语法编写的查询转换为用 fluent语法编写的等效查询。我在这里使用查询语法的原因是我认为在这种特殊情况下,查询比用流利语法编写的查询更具可读性。
对于记录,流利语法中的等效查询如下:
var userRoles = db.Set<IdentityUserRole>
.Join(db.Set<IdentityRoles>,
identityUserRole => identityUserRole.RoleId,
identityRole => identityRole.RoleId
(identityUserRole, identityRole) => { identityRole. Name })
.Where(x=>x.UserId == userId)
.ToList();
关于Roles
和RolesList
,我现在有以下评论。
由于Roles
可以直接从RoleList
计算,我建议您创建一个只有getter的属性,如下所示:
public string Roles
{
get
{
if(RoleList == null || RoleList.Count == 0)
{
return null;
}
return string.Join(",", RoleList);
}
}