无法编写正确LINQ查询,求助DataGridView用户角色数据展示实现
解决DataGridView展示用户用户名和角色名的LINQ查询问题
看起来你是想通过用户ID(uId)从数据库拉取对应的用户名和角色名,再绑定到DataGridView里对吧?你的原始代码里FirstOrDefault后面直接加{...}的语法是不对的——FirstOrDefault返回的是单个AspNetUserRoles对象,不能这么直接后续拼接,得通过关联查询把用户表和角色表连起来才行。
下面给你几种可行的修正方案:
方案1:单个角色场景(假设用户只有一个角色)
如果你的系统里一个用户仅对应一个角色,用这个写法:
// 先找到该用户的角色关联记录 var userRoleLink = _db.AspNetUserRoles.FirstOrDefault(ur => ur.UserId == uId); if (userRoleLink != null) { // 关联用户表和角色表,获取用户名和角色名 var userInfo = (from user in _db.AspNetUsers join role in _db.AspNetRoles on userRoleLink.RoleId equals role.Id where user.Id == uId select new { 用户名 = user.UserName, 角色名 = role.Name }).FirstOrDefault(); // 绑定到DataGridView if (userInfo != null) { dataGridView1.DataSource = new List<dynamic> { userInfo }; } }
方案2:链式LINQ写法(更简洁)
用链式调用替代查询语法,逻辑和上面一致:
var userInfo = _db.AspNetUserRoles .Where(ur => ur.UserId == uId) // 关联用户表,拿到用户名和角色ID .Join(_db.AspNetUsers, ur => ur.UserId, user => user.Id, (ur, user) => new { ur.RoleId, user.UserName }) // 再关联角色表,拿到角色名 .Join(_db.AspNetRoles, ur => ur.RoleId, role => role.Id, (ur, role) => new { Username = ur.UserName, RoleName = role.Name }) .FirstOrDefault(); // 绑定数据 if (userInfo != null) { dataGridView1.DataSource = new List<object> { userInfo }; }
方案3:多角色场景(用户可能有多个角色)
如果你的系统支持一个用户对应多个角色,把FirstOrDefault改成ToList(),直接绑定整个列表即可:
var userRolesData = _db.AspNetUserRoles .Where(ur => ur.UserId == uId) .Join(_db.AspNetUsers, ur => ur.UserId, user => user.Id, (ur, user) => new { ur.RoleId, user.UserName }) .Join(_db.AspNetRoles, ur => ur.RoleId, role => role.Id, (ur, role) => new { Username = ur.UserName, RoleName = role.Name }) .ToList(); // 直接绑定整个列表到DataGridView dataGridView1.DataSource = userRolesData;
关键说明:
AspNetUserRoles是用户和角色的中间关联表,只存储UserId和RoleId,所以必须关联AspNetUsers表才能拿到用户名,关联AspNetRoles表拿到角色名。- 绑定DataGridView时,单个对象需要包装成集合(比如
List<dynamic>),因为DataGridView的DataSource需要支持IEnumerable类型。
内容的提问来源于stack exchange,提问作者Mehreen
相关产品推荐
相关产品推荐

