public async Task <IEnumerable <Vm> > GetByTeamIdAsync(Guid teamId, string name, bool includePersonal, bool onlyMine, CancellationToken ct) { if (!(await _playerService.CanAccessTeamAsync(teamId, ct))) { throw new ForbiddenException(); } var vmQuery = _context.VmTeams .Where(v => v.TeamId == teamId) .Select(v => v.Vm) .Distinct(); if (onlyMine) { vmQuery = vmQuery.Where(v => v.UserId.HasValue && v.UserId == _user.GetId()); } else if (!includePersonal) { vmQuery = vmQuery.Where(v => !v.UserId.HasValue); } if (!string.IsNullOrEmpty(name)) { vmQuery = vmQuery.Where(v => v.Name == name); } // order the vms by name honoring trailing number as a number (i.e. abc1, abc2, abc10, abc11) var vmList = sortVmsByNumber(await vmQuery.ToListAsync(ct)); if (includePersonal && !onlyMine) { var personalVms = vmList.Where(v => v.UserId.HasValue).ToList(); if (personalVms.Any()) { if (!(await _playerService.CanManageTeamAsync(teamId, ct))) { foreach (var userVm in personalVms) { if (userVm.UserId.Value != _user.GetId()) { vmList.Remove(userVm); } } } } } return(_mapper.Map <IEnumerable <Vm> >(vmList)); }