After got no answers for my other question here, I've made a different implementation, this time a Union of two Lists instead of the Automapper mapping projection.
public async Task<ActionResult<IEnumerable<MemberDto>>> GetMembersList([FromQuery] UserParams userParams)
{
var members = await _unitOfWork.UserRepository.GetMembersAsync(userParams);
Response.AddPaginationHeader(members.CurrentPage, members.PageSize,
members.TotalCount, members.TotalPages);
return Ok(members);
}
The repository:
public async Task<PagedList<MemberDto>> GetMembersAsync(UserParams userParams)
{
var members1 = await _context.Users
.Where(x => x.Photos.Any(y => y.Url.Substring(0, 4) == "http"))
.Select(m => new MemberDto
{
Id = m.Id,
UserName = m.UserName,
}).ToListAsync();
var member2 = await _context.Users
.Where(x => x.Photos.Any(y => y.Url.Substring(0, 4) != "http"))
.Select(m => new MemberDto
{
Id = m.Id,
UserName = m.UserName,
}).ToListAsync();
var members = members1.Union(member2).OrderBy(x => x.DisplayName).ToList();
var query = members.AsQueryable();
query = query.Where(u => u.UserName == "John");
return await PagedList<MemberDto>.CreateAsync(query, userParams.PageNumber, userParams.PageSize);
}
And the paged list class:
public static async Task<PagedList<T>> CreateAsync(IQueryable<T> source, int pageNumber,
int pageSize)
{
var count = await source.CountAsync();
var items = await source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync();
return new PagedList<T>(items, count, pageNumber, pageSize);
}
But when I send the request I get the following error:
System.InvalidOperationException: The provider for the source 'IQueryable' doesn't implement 'IAsyncQueryProvider'. Only providers that implement 'IAsyncQueryProvider' can be used for Entity Framework asynchronous operations.
Some answers in Stackoverflow provide a workaround using View() which is used for only for MVC.