【问题标题】:How to resolve - unable to cast Generic.List to Linq.IQueryable using Automapper?如何解决 - 无法使用 Automapper 将 Generic.List 转换为 Linq.IQueryable?
【发布时间】:2014-02-08 15:45:26
【问题描述】:

我在使用 DTO 和 EF 模型时遇到以下错误:

无法转换类型的对象 'System.Collections.Generic.List1[Project.Core.UI.Models.ContentTypes]' to type 'System.Linq.IQueryable1[Project.Core.UI.Models.ContentTypes]

自举: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;

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

【问题讨论】:

    标签: c# entity-framework generics automapper


    【解决方案1】:

    您需要注意这样一个事实,即通过以下方式创建映射:

    Mapper.CreateMap<ContentType, Project.Core.UI.Models.ContentTypes>();
    

    仅隐式支持这些基本的通用集合类型:

    IEnumerable
    IEnumerable<T>
    ICollection
    ICollection<T>
    IList
    IList<T>
    List<T>
    Arrays
    

    但不是IQueryable&lt;T&gt;。这就是你得到例外的原因。

    因此你应该尝试这样做:

    var dto = Mapper.Map
             <IEnumerable<ContentType>, 
              IEnumerable<ContentTypes>>(result.AsEnumerable()); 
    // or e.g. List/List/ToList()
    

    【讨论】:

      【解决方案2】:

      除了 bejger 所说的之外,您还可以使用 Automapper 中的 QueryableExtensions 命名空间来映射 IQueryable 对象,但是当您执行 CreateMap&lt;TSource, TDest&gt; 时,它会将一些 limitations 用于您可以在两个对象之间进行的设置@

      而不是像使用它一样

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

      你可以像使用它一样使用它

      IQueryable<ContentTypes> dto = result.Project().To<ContentTypes>();
      

      【讨论】:

      • 在这种情况下Project() 来自哪里?结果没有任何引用。
      • 要同时使用Project()To&lt;T&gt;(),您需要将using AutoMapper.QueryableExtensions; 添加到文件顶部。 It is included with Automapper
      【解决方案3】:

      您可以改用“ProjectTo”方法。

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

      您可以根据需要从任何注入的 Mapper 实例传递 ConfigurationProvider。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 2022-01-02
        相关资源
        最近更新 更多