public async Task<Pagination<UserInfo>> GetUsers(
string roleID,
string? keyword = null,
int pageIndex = 1,
int pageSize = 20,
CancellationToken token = default)
{
await using var scope = scopeFactory.CreateAsyncScope();
var db = scope.ServiceProvider
.GetRequiredService<ApplicationDbContext>();
var query =
(from user in db.Users.AsNoTracking()
join ur in db.UserRoles.AsNoTracking() on user.Id equals ur.UserId
join role in db.Roles.AsNoTracking() on ur.RoleId equals role.Id
where (string.IsNullOrWhiteSpace(keyword)
|| (user.UserName != null && user.UserName.ToLower().Contains(keyword.ToLower()))
|| (user.FullName != null && user.FullName.ToLower().Contains(keyword.ToLower())))
&& (string.IsNullOrWhiteSpace(roleID) || role.Id == roleID)
select user)
.Distinct();
var totalItems = await query.CountAsync(token);
if (pageSize <= 0)
pageSize = 20;
var totalPages = (int)Math.Ceiling((double)totalItems / pageSize);
if (pageIndex < 1)
pageIndex = 1;
if (totalPages > 0 && pageIndex > totalPages)
pageIndex = totalPages;
var users = await query
.OrderBy(u => u.UserName)
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.Select(user => new UserInfo
{
UserId = user.Id,
UserName = user.UserName ?? string.Empty,
Email = user.Email ?? string.Empty,
PasswordHash = user.PasswordHash ?? string.Empty,
FullName = user.FullName ?? string.Empty,
PhoneNumber = user.PhoneNumber,
SchoolID = user.SchoolID,
SchoolName = user.SchoolName,
ClassID = user.ClassID,
ClassName = user.ClassName,
CategoryID = user.CategoryID,
CategoryName = user.CategoryName,
BigGenreId = user.BigGenreID,
BigGenreName = user.BigGenreID,
LicenseKey = user.LicenseKey ?? string.Empty,
IsAllowLoginOnOtherMachine = user.IsAllowLoginOnOtherMachine,
Followers = user.Followers,
Following = user.Following,
Friends = user.Friends,
UserStatus = user.UserStatus,
JobTitle = user.JobTitle,
JobDescription = user.JobDescription,
Projects = user.Projects,
Awards = user.Awards,
Avatar = user.Avatar,
Education = user.Education,
Experience = user.Experience,
DOB = user.DOB,
Location = user.Location,
Skills = user.Skills,
IsUtilities = user.IsUtilities,
UserSettings = user.UserSettings,
CreatedAt = user.CreatedAt.ToString(Constants.DateTimeFormat),
UpdatedAt = user.UpdatedAt.ToString(Constants.DateTimeFormat),
LastLogin = user.LastLogin.ToString(Constants.DateTimeFormat),
CreatedBy = user.CreatedBy,
UpdatedBy = user.UpdatedBy,
Remark = user.Remark,
})
.ToListAsync(token);
return new Pagination<UserInfo>
{
TotalItems = totalItems,
TotalPages = totalPages,
PageIndex = pageIndex,
ItemPerPage = pageSize,
NextPage = pageIndex < totalPages ? pageIndex + 1 : pageIndex,
PrevPage = pageIndex > 1 ? pageIndex - 1 : 1,
Items = users
};
}