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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决 - 无法使用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);

(可选)根据需要从任何注入的Mapper实例传递ConfigurationProvider。

以上是关于如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable?的主要内容,如果未能解决你的问题,请参考以下文章

Automapper 无法在单元测试项目中映射外键属性

C#console app与DB first Entity Framework和AutoMapper,无法将Model转换为DbModel

尝试将 AutoMapper 添加到 .NetCore1.1 - 无法识别 services.AddAutoMapper()

如何使用 AutoMapper 将对象列表转换为整数列表?

如何使用 AutoMapper 使用 EntityFramework 使用嵌套列表更新对象?

如何在 .NetCore 中使用 AutoMapper 高级功能