搜寻位置人员的最佳方法

时间:2019-02-19 01:41:13

标签: c# asp.net entity-framework search

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

简而言之,我试图让 Admin 的Sam仅在他的位置(限于他的位置)中找到用户,因此在此示例中,Mark是常规用户位于HeadLocationLocation1中,山姆可以找到它。

用户表

|---------------------------------|
| 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);
    }

1 个答案:

答案 0 :(得分:0)

这是您查询的通用视图。我在这里输入的内容可能有一些输入错误,而不是在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);
}