使用相同的查询从数据库中获取管理员角色的所有数据,但不获取其他角色的所有数据

Get all data from database for Administrator role but not for other roles, using same query

我目前正在 Visual Studio 2019 年使用 ASP.NET MVC 5 开发 Web 应用程序。

该应用程序是关于学校管理系统。

应用程序有一个控制和管理系统,它对所有具有某些角色的登录用户具有相同的UI。

角色是管理员、教师、会计

当任何上述角色的用户登录时,用户会看到一个主屏幕仪表板,他们可以在其中查看学校相关和 class 相关的简要快照数据。

管理员将能够在同一仪表板页面和整个 Web 应用程序中查看学校、学生和教师的所有数据。

教师将只能看到与其 class 和学生相关的数据,不能看到管理员和会计角色的数据。

我考虑过使用登录用户的某个 ID 将参数传递给每个 LINQ 查询,但实际情况是,LINQ 中只有在教师登录时才有用,但管理员需要所有数据,因此我需要修改当时的查询。

如何使用同一个控制器实现这一点,将全部数据提供给管理员角色,将部分数据提供给教师角色?

家庭控制器

public class HomeController : Controller
    {
        DBEntities db = new DBEntities();

        public ActionResult Index()
        {
            return View();
        }
        public ActionResult GetLatestActivity(int id)
        {
            var data = from n in db.ACTIVITies
                       where n.USERID == id //This is ok when teacher is logged in but Admin needs all data, so not useful there
                       orderby n.ID descending
                       select new ActivityViewModel
                       {
                           ID = n.ID,
                           AREA = n.AREA,
                           SECTION = n.SECTION,
                           MESSAGE = n.MESSAGE,
                           CREATE_TIMESTAMP = (DateTime)n.CREATE_TIMESTAMP
                       };
            return Json(data.Take(6), JsonRequestBehavior.AllowGet);
        }
    }

我认为如果您使用 Microsoft.AspNet.Identity,您可以这样做,因为我不清楚。否则,您可以实现自己的 isAdmin 检查方法。

    public ActionResult GetLatestActivity(int id)
    {
        var isAdmin = User.IsInRole("Administrator"); 

        var data = from n in db.ACTIVITies
                   where n.USERID == (isAdmin ? n.USERID : id)
                   orderby n.ID descending
                   select new ActivityViewModel
                   {
                       ID = n.ID,
                       AREA = n.AREA,
                       SECTION = n.SECTION,
                       MESSAGE = n.MESSAGE,
                       CREATE_TIMESTAMP = (DateTime)n.CREATE_TIMESTAMP
                   };
        return Json(data.Take(6), JsonRequestBehavior.AllowGet);
    }