【发布时间】:2021-12-09 17:26:56
【问题描述】:
在没有得到my other question here 的答案后,我做了一个不同的实现,这次是两个列表的联合,而不是 Automapper 映射投影。
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);
}
存储库:
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);
}
还有分页列表类:
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);
}
但是当我发送请求时,我收到以下错误:
System.InvalidOperationException:源的提供程序 “IQueryable”没有实现“IAsyncQueryProvider”。仅提供者 实现“IAsyncQueryProvider”的可用于实体框架 异步操作。
Stackoverflow 中的一些答案提供了一种使用 View() 的解决方法,该方法仅用于 MVC。
【问题讨论】:
-
ToList().AsQueryable()- 这不再是 EF Core 可查询的,因此出现错误消息。尝试从代码中删除所有ToList/ToListAsync调用。 -
@IvanStoev 如果我这样做,查询将不会被翻译。
-
如果不能翻译,就不能高效分页(所有数据都已经加载到内存中了)。要在内存中进行分页,请创建并使用另一个非异步
Create方法,该方法采用IEnumerable<T>并在内部使用同步 LINQ to Objects 方法(例如source.Count())。 -
我已经创建了非异步方法,但仍然无法翻译。
标签: c# entity-framework-core asp.net-core-webapi