【问题标题】:Filter role based users in c# linq在 c# linq 中过滤基于角色的用户
【发布时间】:2019-10-09 20:12:04
【问题描述】:

我们的系统中有多个角色,一个用户可以有多个角色分配给它 一切都是定制的。我们没有使用身份等。

我正在发送我的 api 请求,其中包含“guest”、“admin”等角色。 Api 应该只返回具有这些角色的用户

这就是我过滤用户的方式 List<string> roles -> 这是一个具有角色名称的变量 来自前端假设“管理员”

roles = "admin" -> 但可以有更多角色

UserRoleMappings 是保存用户 ID 和 角色 id 组合以保存特定用户的角色

现在在获取所有用户时,我想过滤它们以便

query.Where(user => user.UserRoleMappings.Any(urm => roles.Contains(urm.UserRole.Name)));

此查询正在获取具有“admin”+“guests”角色的用户,就像我一样 应用包含。但我需要只有“管理员”角色的用户

因为

user

1  user1
2 user2

role
1 admin
2 guest

userMapping
1 1
1 2
2 1

Api 应该只返回 user2,但它也返回 user1。这个方法应该是通用的,应该适用于多个角色

感谢和问候

【问题讨论】:

  • 您是否具有从角色(到映射)到用户的导航属性?如果您发布您的实体,也许会有所帮助。
  • 从您的userMapping 表看来,两个用户都具有管理员角色。所以请确保数据正确,并指定哪一列包含哪个 id。
  • 假设:(userMapping(或者是UserRoleMappings???)有行,用户,角色然后你有1 -> 1和2 -> 1所以两个用户都有管理员角色。

标签: c# .net linq entity-framework-6 iqueryable


【解决方案1】:

如果您需要只有管理员角色而没有其他角色的用户,您可以这样做

var adminUsers = query
    .Where(user => user.UserRoleMappings.All(urm => urm.UserRole.Name == "admin"));

因为如果他们的“所有”角色都被命名为“admin”,那么它必然是他们拥有的唯一角色。

【讨论】:

    【解决方案2】:

    你必须使用 select 和 Where, query.Select(user => user.UserRoleMappings.where(urm => roles.Contains(urm.UserRole.Name))).toList();

    现在你的 where 子句将只返回匹配的元素

    【讨论】:

    • 这不会返回 List> 而 OP 想要的是用户列表吗?
    猜你喜欢
    • 2013-01-27
    • 2014-02-13
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2018-05-05
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多