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

时间:2014-02-08 15:45:26

标签: c# entity-framework generics automapper

使用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;

如何为此创建适当的映射?

3 个答案:

答案 0 :(得分:5)

您需要了解通过以这种方式创建映射这一事实:

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()

答案 1 :(得分:2)

除了bejger所说的,你还可以使用Automapper中的QueryableExtensions命名空间来映射IQueryable对象,但是当你执行{{}}时,它会在两个对象之间设置limitations。 {1}}

而不是像

那样使用它
CreateMap<TSource, TDest>

你改为使用

IQueryable<ContentTypes> dto = Mapper.Map<IQueryable<ContentType>, IQueryable<ContentTypes>>(result);

答案 2 :(得分:0)

您可以改用'ProjectTo'方法。

var result = iQueryableResultSet.ProjectTo<MyObjectName>(_mapper.ConfigurationProvider);

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