使用automapper从另一个集合映射到集合

时间:2017-09-14 19:19:14

标签: c# automapper

我的AutoMapper配置如下所示

 public static class AutoMapperConfig
  {
    public static void ConfigureAutoMapper(this IMapperConfigurationExpression cfg)
    {
      cfg.CreateMap<Foo, BarDTO>()
        .ForMember(dto => dto.Genres, o => o.ResolveUsing(b =>
        {
          var retVal = new List<string>();

          foreach (var genre in b.Genres)
          {
            retVal.Add(genre.Genre.GenreName);
          }

          return retVal;
        }));
    }
  }

BarDTO的属性类型是类型字符串

的集合

这最终会出现异常:

  

System.InvalidOperationException:'类型没有通用方法'ToList'   'System.Linq.Enumerable'与提供的类型兼容   参数和论点。如果是,则不应提供类型参数   方法是非通用的。 “

如果我尝试这样做:

cfg.CreateMap<Foo, BarDTO>()
.ForMember(dto => dto.Genres, conf => conf.MapFrom
 (
  ol => ol.Genres.Select(tr => tr.Genre.GenreName).ToList())
 );

这不会抛出任何异常,但没有任何反应。看起来像无限映射(加载)。

提前谢谢!

编辑:

这是我的课程。我使用Entity-Framework Core 2.0,这就是我必须自己创建与Foo2Genre的n到m关系的原因。

public class BarDTO
{
    public BarDTO()
    {
      Genres = new List<string>();
    }
    public ICollection<string> Genres { get; set; }
}

public class Foo
{
    public Foo()
    {
      Genres = new List<Foo2Genre>();
    }
    public ICollection<Foo2Genre> Genres { get; set; }
}

 public class Foo2Genre 
  {
    public int FooId{ get; set; }
    public Foo Foo{ get; set; }

    public int GenreId { get; set; }
    public Genre Genre { get; set; }
  }

 public class Genre
 {
    public Genre()
    {
      Foos = new List<Foo2Genre>();
    }

    public string GenreName { get; set; }

    public ICollection<Foo2Genre> Foos{ get; set; }
 }

1 个答案:

答案 0 :(得分:1)

我认为你需要一个包含类型。这将在EF6中发挥作用。