无法将类型 'System.Collections.Generic.List`1[]' 的对象转换为类型 'System.Linq.IQueryable`1[]'

Unable to cast object of type 'System.Collections.Generic.List`1[]' to type 'System.Linq.IQueryable`1[]'

我在单元测试中得到了以下代码。但是,它 return 是 运行.

时提到的错误
var leaveTypesList = new List<LeaveType>() { leaveType1, leaveType2, leaveType3 };
var leaveTypesQueryable = leaveTypesList.AsQueryable();
mockLeaveTypeRepository.Setup(r => r.GetLeaveTypes()).Returns(leaveTypesQueryable);
var leaveTypeDtos = service.GetLeaveTypes();

从服务 return 编辑结果时,从最后一行生成错误。

下面列出的GetLeaveTypes方法的服务代码,是对版本库的简单访问。

    public IQueryable<LeaveTypeDto> GetLeaveTypes()
    {
        //return Mapper.Map<IQueryable<LeaveTypeDto>>(leaveTypeRepository.GetLeaveTypes());
        return leaveTypeRepository.GetLeaveTypes().ProjectTo<LeaveTypeDto>();
    }

存储库代码也是 IQueryable 休假类型的简单 return。

    public IQueryable<LeaveType> GetLeaveTypes()
    {
        return dbContext.LeaveType.Where(lt => lt.IsActive);
    }

只是想不通这里出了什么问题。有什么想法吗?

您想将 leaveTypeRepository.GetLeaveTypes() 映射到匹配 DTO 对象的 IQueryable。我假设您想要这个,因为 leaveTypeRepository.GetLeaveTypes() 也是一个 IQueryable,并且您想与其查询提供者保持联系。

AutoMapper 有一个 different method 为此:

using AutoMapper.QueryableExtensions;

...

return leaveTypeRepository.GetLeaveTypes()
           .ProjectTo<LeaveTypeDto>();

这个 returns 一个 IQueryable<LeaveTypeDto>,您可以对其应用后续的 LINQ 方法,它仍然会被翻译成 SQL。

现在是异常的原因。这是因为 IQueryable<T> 没有默认实现。 AutoMapper 创建 List<LeaveTypeDto>,但无法将其原生转换为 IQueryable<LeaveTypeDto>。但是,您可以执行诸如 ...

Mapper.Map<IEnumerable<LeaveTypeDto>>(source)
Mapper.Map<IList<LeaveTypeDto>>(source)
Mapper.Map<LeaveTypeDto[]>(source)

...因为对于那些目标类型,AutoMapper 知道它应该使用哪个默认实现(List<T>T[])。