我有3个表,其中包含位置,用户及其相关ID。 我想要达到的目的是允许管理员能够搜索 特定位置的用户。
简而言之,我试图让 Admin 的Sam仅在他的位置(限于他的位置)中找到用户,因此在此示例中,Mark是常规用户位于HeadLocation
和Location1
中,山姆可以找到它。
用户表
|---------------------------------|
| 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);
}
答案 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);
}