gpt4 book ai didi

entity-framework - 根据某些条件与另一个表连接后设置 IQueryable 中的属性值

转载 作者:行者123 更新时间:2023-12-03 17:27:01 25 4
gpt4 key购买 nike

我正在为 WPF 实现授权。我有与屏幕绑定(bind)的权限。例如,有一个屏幕叫做 floor。它有四个与之关联的权限。

  • 查看楼层
  • 添加楼层
  • 编辑楼层
  • 删除楼层

  • 除了每个权限,我们还有四个级别的权限。
  • 全部
  • 本人
  • 角色
  • 用户

  • 因此,如果用户拥有权限级别为 {ALL} 的 {View Floor} 权限。他们可以查看任何用户创建的所有楼层。
    如果用户有 {Self} 权限级别。他们只能查看自己创建的楼层。
    如果用户的权限级别为 {Role}。他们可以查看根据指定角色分配的所有楼层。
    权限级别的角色分配如下:
    Roles: Supervisor, Technician
    如果 BranchManager 具有上述权限级别。然后,他可以查看自己创建的楼层以及具有主管或技术人员角色的任何用户创建的楼层。
    权限级别 {User} 与 {Role} 相同。
    这是我的 IQueryable 来获取楼层:
    IQueryable<FloorModel> FloorsQueryable = (from f in Floors
    join b in Branches on f.BranchId equals b.Id
    where (string.IsNullOrEmpty(filters.Name) || f.Name.ToLower().Contains(filters.Name.ToLower()))
    && (string.IsNullOrEmpty(filters.BranchName) || b.Name.ToLower().Contains(filters.BranchName.ToLower()))
    && (f.IsDeleted == null || f.IsDeleted == false)
    && f.BranchId == CurrentBranchId
    && f.ApplicationId == CurrentApplicationId
    select new FloorModel
    {
    Id = f.Id,
    Name = f.Name,
    Code = f.Code,
    Branch = new BranchBriefModel()
    {
    Id = f.BranchId,
    Name = b.Name,
    },
    IsActive = f.IsActive ?? false,
    Description = f.Description,
    CreatedBy = f.CreatedBy ?? 0,
    ApplicationId = CurrentApplicationId,
    }).AsQueryable();
    在此之后,我需要根据权限级别对此查询应用一些自定义过滤器
    FloorsQueryable = CustomFilter(FloorsQueryable,CurrentUserId,filters);
    自定义过滤器代码
    public IQueryable<T> CustomFilter<T>(IQueryable<T> query, int CurrentUserId, BaseSearchModel search) where T : BaseModel, new()
    {
    var distinctClaims = search.ScreenPermission.Select(x => x.Claim.PermissionLevel).Distinct().ToList();
    var viewPermission = search.ScreenPermission.Where(x => x.Name.Contains("View")).FirstOrDefault();
    if (viewPermission != null && viewPermission.Claim.PermissionLevel != PermissionLevelCatalog.All)
    {
    if (distinctClaims.Any(x => x == PermissionLevelCatalog.Role))
    {
    query = (from q in query
    join ur in UsersInRoles on q.CreatedBy equals ur.UserId
    join r in Roles on ur.RoleId equals r.Id
    select q);
    }
    string propertyName = "CreatedBy";
    //if (string.IsNullOrEmpty(propertyName))
    // return query;
    // we have parameter "generic"
    var selectorParameter = Expression.Parameter(typeof(T), "generic");
    // constant "CurrentUserId"
    var searchTermExpression = Expression.Constant(CurrentUserId);
    // "generic.CreatedBy"
    var selector = Expression.PropertyOrField(selectorParameter, propertyName);
    // "generic.CreatedBy == "CurrentUserId"
    var equal = Expression.Equal(selector, searchTermExpression);
    // generic => generic.Name == "CurrentUserId"
    var genericWhere = Expression.Lambda<Func<T, bool>>(equal, selectorParameter);
    query = query.Where(genericWhere);
    }
    return query;
    }
    现在对于权限级别 {Role},我需要在 IQueryable 的 select 子句中添加 CreatorRoleId 以在以下代码中应用所需的检查。
    if (distinctClaims.Any(x => x == PermissionLevelCatalog.Role))
    {
    query = (from q in query
    join ur in UsersInRoles on q.CreatedBy equals ur.UserId
    join r in Roles on ur.RoleId equals r.Id
    select q
    );
    }
    是否有可能设置 CreatorRoleId 的值?像下面这样的东西
    select {q=>q.CreatorRoleId=r.Id return q;}
    这应该是通用的并且适用于任何 IQueryable。我不想为项目中的所有查询加入 Role 和 UserInRole 表,因为只有当某些用户具有此 {Role} 权限级别时才需要这些连接。

    最佳答案

    我认为它类似于 return query.Where(q => q.CreatorRoleId == r.Id);我猜。

    关于entity-framework - 根据某些条件与另一个表连接后设置 IQueryable<T> 中的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59747557/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com