【发布时间】:2020-09-06 13:36:04
【问题描述】:
[已解决]
return await _context.AspNetUsers.Where( x => x.AspNetUserRoles.Count() == 0).ToListAsync();
完成这项工作,返回我想要的 AspNetUsers 对象。 Mustafa Arslan 的回答也仅适用于 userId
[原问题]
我有两张桌子AspNetUsers 和AspNetUserRoles。
AspNetUsers 表有很多列,但 AspNetUserRoles 有两列:userId 和 roleId;
我想查询每个没有角色的用户并从我的控制器调用它。
询问
这给出了我想要的结果
SELECT *
FROM AspNetUsers
LEFT JOIN AspNetUserRoles ON AspNetUsers.Id = AspNetUserRoles.UserId
WHERE AspNetUserRoles.RoleId IS NULL
这是我在控制器中的方法,它假设返回 AspNetUsers 的列表,但 Join 给出并错误提示:
The type arguments for method 'Queryable.Join<TOuter, TInner, TKey, TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter, TKey>>, Expression<Func<TInner, TKey>>, Expression<Func<TOuter, TInner, TResult>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
控制器
[HttpGet]
[Route("Group")]
public async Task<ActionResult<IEnumerable<AspNetUsers[]>>> GetAspNetUsersWithGroups()
{
return await _context.AspNetUsers.Join(_context.AspNetUserRoles,
users => users.Id,
roles => roles.userId,
(AspNetUsers) => new { Id = roles.Id }); // This is where I think the error is
}
正确的写法是什么?
【问题讨论】:
-
为什么不使用更清洁的方法?类似
_context.AspNetUsers.Where(x => x.Roles.Count() == 0).ToListAsync() -
AspNetUsers 没有关于角色本身的专栏。两个表只有 Id 列相同。
-
完全一样。如果没有加入实体,则用户没有分配任何角色
-
您应该使用
x.AspNetUserRoles.Any()而不是x.AspNetUserRoles.Count() == 0。更快