.NET6中IQueryable调用GetAwaiter报错,.NET5迁移代码问题咨询
问题分析与解决
第一个错误的根源
你不能直接对IQueryable(或这里的IIncludableQueryable)使用await,因为await要求操作返回Task或Task<T>类型,而Include链式调用后返回的只是一个未执行的查询对象,并非异步任务。.NET5中EF Core可能有宽松的类型兼容逻辑,但.NET6严格了类型检查,因此触发报错。
加ToListAsync()后的错误原因
ToListAsync()返回的是Task<List<Employee>>,await之后得到的是List<Employee>实例,你强行将其转换为IQueryable<Employee>属于明显的类型不匹配,必然抛出强制转换失败的错误。
正确的两种处理方案
方案1:返回延迟执行的IQueryable<Employee>(适合后续还要拼接查询的场景)
直接去掉await,因为IQueryable本身是延迟加载机制,查询不会立即执行,直到你调用ToListAsync()、FirstAsync()这类异步执行方法:
public IQueryable<Employee> FindAllEmployees() { try { IQueryable<Employee> employeeModel = _employeeContext.Employee .AsNoTracking() .Include(a => a.Policies).ThenInclude(a => a.Product).ThenInclude(a => a.Underwriter) .Include(a => a.PrincipalMember); return employeeModel; } catch (Exception ex) { _logService.LogError(ex.Message); throw; } }
注意:这里方法返回类型从
Task<IQueryable<Employee>>改为IQueryable<Employee>,因为不需要异步操作。
方案2:返回已加载的员工集合(适合直接获取数据的场景)
修改方法返回类型为Task<List<Employee>>,直接await ToListAsync(),无需强制转换:
public async Task<List<Employee>> FindAllEmployees() { try { List<Employee> employeeModel = await _employeeContext.Employee .AsNoTracking() .Include(a => a.Policies).ThenInclude(a => a.Product).ThenInclude(a => a.Underwriter) .Include(a => a.PrincipalMember) .ToListAsync(); return employeeModel; } catch (Exception ex) { _logService.LogError(ex.Message); throw; } }
总结
- 若需继续拼接查询逻辑,用方案1返回
IQueryable,不要用await - 若需直接拿到内存中的数据,用方案2返回
List<Employee>的异步任务,正确使用ToListAsync()
内容的提问来源于stack exchange,提问作者tumo maraisane
相关产品推荐
相关产品推荐

