我在使用DTO和EF模型时遇到以下错误:
无法转换类型为'System.Collections.Generic.List
1[Project.Core.UI.Models.ContentTypes]' to type 'System.Linq.IQueryable
1 [Project.Core.UI.Models.ContentTypes]的对象
Bootstrapped:Mapper.CreateMap<ContentType, Project.Core.UI.Models.ContentTypes>();
在OData控制器方法public IQueryable<ContentTypes> Get() {...}
中,使用:
var result = Mapper.Map<IQueryable<ContentType>, IQueryable<ContentTypes>>(_repository.Query().Get()
.Where(u => u.UserId == userId)
.OrderBy(o => o.Description));
我也试过以下但我怀疑这正是上面的内容:
var result =_repository.Query().Get()
.Where(u => u.UserId == userId)
.OrderBy(o => o.Description);
var dto = Mapper.Map<IQueryable<ContentType>, IQueryable<ContentTypes>>(result);
return dto;
如何为此创建适当的映射?
您需要了解通过以这种方式创建映射这一事实:
Mapper.CreateMap<ContentType, Project.Core.UI.Models.ContentTypes>();
隐式支持这些基本泛型集合类型:
IEnumerable
IEnumerable<T>
ICollection
ICollection<T>
IList
IList<T>
List<T>
Arrays
但不是IQueryable<T>
。这就是你得到例外的原因。
所以你应该尝试这样做:
var dto = Mapper.Map
<IEnumerable<ContentType>,
IEnumerable<ContentTypes>>(result.AsEnumerable());
// or e.g. List/List/ToList()
除了bejger所说的你还可以使用Automapper中的QueryableExtensions命名空间来映射IQueryable对象,但是当你执行你的limitations时,它会对你在两个对象之间做什么设置放一些CreateMap<TSource, TDest>
而不是喜欢它
IQueryable<ContentTypes> dto = Mapper.Map<IQueryable<ContentType>, IQueryable<ContentTypes>>(result);
你反而喜欢它
IQueryable<ContentTypes> dto = result.Project().To<ContentTypes>();
您可以使用“ProjectTo”方法。
var result = iQueryableResultSet.ProjectTo<MyObjectName>(_mapper.ConfigurationProvider);
(可选)根据需要从任何注入的Mapper实例传递ConfigurationProvider。