无法将类型 '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[]
)。
我在单元测试中得到了以下代码。但是,它 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[]
)。