public virtual IQueryable <T> ApplyFilter(IQueryable <T> query) { query = query.Where(Query); if (Ids.Count > 0) { query = query.Where(d => Ids.Contains(d.Id)); } if (_isOwnedByOrganization && OrganizationIds.Count > 0) { query = query.Where(d => OrganizationIds.Contains(((IOwnedByOrganization)d).OrganizationId)); } if (_isOwnedByProject && ProjectIds.Count > 0) { query = query.Where(d => ProjectIds.Contains(((IOwnedByProject)d).ProjectId)); } if (_isOwnedByStack && StackIds.Count > 0) { query = query.Where(d => StackIds.Contains(((IOwnedByStack)d).StackId)); } return(query); }
public IQueryable <ITask> Where(IQueryable <ITask> tasks) { #region Фильтры tasks = tasks.Where(x => x.BoardId == BoardId); if (!IsAllIn(ExecutorIds, _AllUserIds)) { tasks = from t in tasks where ExecutorIds.Contains(t.ExecutorUserId) select t; } if (!IsAllIn(CreatorIds, _AllUserIds)) { tasks = from t in tasks where CreatorIds.Contains(t.CreatorUserId) select t; } if (!IsAllIn(ProjectIds, _AllProjectIds)) { tasks = from t in tasks where ProjectIds.Contains(t.ProjectId) select t; } if (!IsAllIn(ColorIds, _AllColorIds)) { tasks = from t in tasks where ColorIds.Contains(t.ColorId) select t; } if (!IsAllIn(Statuses, _AllStatuses)) { if (Statuses.Any(x => x == TimezStatus.ArchiveStatusId || x <= 0)) { throw new ArgumentOutOfRangeException(); } tasks = from t in tasks where Statuses.Contains(t.TaskStatusId) select t; } if (!string.IsNullOrWhiteSpace(Search)) { tasks = from t in tasks where t.Name.ToUpper().Contains(Search.Trim().ToUpper()) select t; } #endregion #region Ограничение по роли пользователя в доске UserRole role = _Settings.GetUserRole(); if (!role.HasTheFlag(UserRole.Owner) && !role.HasTheFlag(UserRole.Observer)) { // владелец и наблюдатель получают все задачи // исполнитель и заказчик только свои if (role.HasAnyFlag(UserRole.Executor | UserRole.Customer)) { // есть обе роли, значит нужно оба типа задач tasks = from t in tasks where t.ExecutorUserId == _Settings.UserId || // назначенные на пользователя t.CreatorUserId == _Settings.UserId // назначенные пользоватем select t; } else if (role.HasTheFlag(UserRole.Executor)) { tasks = from t in tasks where t.ExecutorUserId == _Settings.UserId // только назначенные на пользователя select t; } else if (role.HasTheFlag(UserRole.Customer)) { tasks = from t in tasks where t.CreatorUserId == _Settings.UserId // только назначенные пользоватем select t; } else { throw new AccessDeniedException(); } } #endregion return(tasks); }