首页 > 解决方案 > 搜索位置人员的最佳方式

问题描述

我有 3 个表格,其中包含位置、用户及其相关 ID。我想要实现的是允许管理员能够搜索特定位置的用户。

所以简而言之,我试图让作为管理员的 Sam 只能在他的位置(仅限于他的位置)找到用户,所以在这个例子中,作为普通用户的 Mark 位于HeadLocation并且Location1可以被 Sam 找到.

用户表

|---------------------------------|
| UserId   |    Role   | FName    |
|---------------------------------|
|  1       |    Admin  | Sam      |

OfficeUser 表

|---------------------------------------|
| OfficeUserId | OfficeId     | UserId  |
|---------------------------------------|
|  55          |    1         |     1   |

办公桌

|----------------------------------------------|
| OfficeId     | HeadOfficeId |  LocNames      |
|----------------------------------------------|
|  1           |    null      | HeadLocation   |
|----------------------------------------------|

代码

[HttpGet]
    public IActionResult SearchUsers(string searchUser, string id)
    {
        //userId from claims
        var userId = User.FindFirst(ClaimTypes.NameIdentifier).Value;
        //gets userId for users with role of admin
        var admin = _context.User.FirstOrDefault(a => a.Role == "Admin")?.UserId.ToString();


        if (adminExists && admin == userId)
        {
         //This is where I'm unclear...
         var search = from a in _context.OfficeUser
                     join b in _context.Office
                     on a.OfficeId equals a.OfficeId
                          select new
                          {
                            a.UserId,
                            //trying to get names per locations
                          };

        if (search == null)
        {
            return NotFound();
        }

        if (!String.IsNullOrEmpty(searchUser))
        {
            search = search.Where(a => a.FName.Contains(searchUser));
        }
        else
        {
            return NotFound("No Users Found");
        }

        }



        return Ok(search);
    }

标签: c#asp.netentity-frameworksearch

解决方案


这将是您查询的一般视图。可能有一些打字错误,因为我在这里输入了这个,而不是在 Visual Studio 编辑器中。

[HttpGet]
public IActionResult SearchUsers(string searchUser, string id)
{
    var loggedInUserId = User.FindFirst(ClaimTypes.NameIdentifier).Value;

    var isLoggedInUserAdmin = _context.User.Any(u => u.UserId == loggedInUserId && u.Role == "Admin");

    if (isLoggedInUserAdmin)
    {
       var adminLocations = _context.OfficeUser.Where(ou => ou.UserId == userId).Select(ou => ou.Office.LocNames).ToList();

       var searchQuery = _context.OfficeUsers.Where(ou => adminLocations.Contains(ou.Office.LocNames)).Select(ou => ou.User);

       if (!String.IsNullOrEmpty(searchUser))
       {
            searchQuery = searchQuery.Where(q => q.FName.Contains(searchUser));
       }

       var adminLocUserList  = searchQuery.ToList();
       return Ok(userList)
    }

    var userList = _context.OfficeUsers.Where(ou.User.FName.Contains(searchUser)).Select(ou => ou.User).ToList();

    return Ok(userList);
}

推荐阅读