【问题标题】:Stuck on a part of a linq query卡在 linq 查询的一部分
【发布时间】:2014-12-14 17:12:52
【问题描述】:

我有这个与自动完成一起使用的 linq 查询,传入一个匹配电子邮件或用户名的术语,它从我的数据库返回用户详细信息 (UserDetails)

var details = db.AspNetUsers
            .Join(db.UserDetails, 
              anu => anu.Id, ud => ud.Id, (anu, ud) => new { anu, ud })
            .Where(@t => @t.anu.Email.Contains(term) 
               || (@t.ud.firstname + @t.ud.lastname).Contains(term))
            .OrderBy(@t => @t.ud.lastname)
            .ThenBy(@t => @t.ud.firstname)
            .ThenBy(@t => @t.anu.Email)
            .Select(@t => new MemberDetails
            {
              FirstName = @t.ud.firstname,
              LastName = @t.ud.lastname,
              Email = @t.anu.Email,
              Phone = @t.ud.phone,
              Postcode = @t.ud.postcode,
              MemberNumber = @t.ud.membershipNumber,
              Street = @t.ud.street,
              City = @t.ud.city,
            }).ToList();

我缺少的是,假设我是登录用户,我创建了一个名为 UserRoleAdmins 的表,其中包含 2 列

 - RoleId nvarchar(128)
 - UserId nvarchar(128)

RoleId 是 AspNetRoles 表的 FK,而 UserId 是我的 UserDetails 表的 FK

假设我们有 3 个角色,红队、蓝队、绿队,我是红队和绿队的管理员,所以 UserRolesAdmin 表中的 2 条记录包含红队 id 和我的用户 id,以及绿色的团队 id 和我的用户 id

我想确保我返回的用户属于红队或绿队

【问题讨论】:

  • 你为什么使用@t?它只会让阅读变得更加困难。
  • 澄清一下,您希望查询返回查询用户所属团队的所有用户吗?管理员会从他的所有团队中获取用户,但“简单”用户只会从他的团队中获取用户。
  • 是的,这是正确的,我不能从字面上说出 == "Admin" 的位置,因为我不知道他们的角色。只允许管理员用户返回用户,普通的非管理员用户不能。

标签: c# linq


【解决方案1】:

在你的第一个 where 之后附加这个:

.Where(x => 
   db.UserRoleAdmins.Any(y => 
       x.ud.UserId == y.UserId && (y.RoleId == "red team" || y.RoleId == "green team")

【讨论】:

  • 谢谢,虽然我不知道他们叫红队和绿队,可能是A队或B队,我不能用文字字符串来检查角色。
  • 标记为答案,因为它让我找到了我需要的东西
【解决方案2】:

感谢 Magnus 让我找到了正确的方向,这是行之有效的方法,通过添加一个额外的 Where

.Where(x => db.UserRoleAdmins.Any(
  y => y.Id == userId && 
  x.anu.AspNetRoles.Select(v=>v.Id).ToList().Contains(y.RoleId)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多