如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable()

敢说敢作敢为, 无怨无恨无悔。这篇文章主要讲述如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable?相关的知识,希望能为你提供帮助。
我在使用DTO和EF模型时遇到以下错误:

无法转换类型为'System.Collections.Generic.List1[Project.Core.UI.Models.ContentTypes]' to type 'System.Linq.IQueryable1 [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);

【如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable()】(可选)根据需要从任何注入的Mapper实例传递ConfigurationProvider。

    推荐阅读