使用AutoMapper映射分组集合

时间:2012-11-09 09:35:03

标签: c# collections ienumerable automapper igrouping

我有以下代码无效:

var groupedZones = this._zoneDataManager.GetZonesGroupedByCountry();
            IEnumerable<IGrouping<String, ZoneDTO>> zonesToReturn = Mapper.Map<IEnumerable<IGrouping<String, Zone>>, IEnumerable<IGrouping<String, ZoneDTO>>>(groupedZones);

我一直收到以下异常:

  

价值   \ “System.Collections.Generic.List 1[SCGRE.Business.Model.ZoneDTO]\" is not of type \"System.Linq.IGrouping 2 [System.String,SCGRE.Business.Model.ZoneDTO] \”   并且不能在此通用集合中使用。\ r \ nParameter name:   值

我不明白为什么它试图将List<T>映射到IGrouping<String, T>或者我没有正确理解异常...但我基本上有一个IEnumerable<IGrouping<String, Zone>>而我想要将其映射到IEnumerable<IGrouping<String, ZoneDTO>>

请注意,我已创建了从ZoneZoneDTO的地图,如下所示:

Mapper.CreateMap<Zone, ZoneDTO>();

这是因为这两个类的属性几乎完全相同。

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

经过一些工作,我想你不能做像

这样的事情
 Mapper.CreateMap<IEnumerable<IGrouping<String, Zone>>, IEnumerable<IGrouping<String, ZoneDTO>>>()

具体来说,AutoMapper支持源集合类型包括:(仅Generic种类型)

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

AutoMapper不支持IGrouping,因为它是非通用的可枚举类型。

相反,您可以采用以下简单方法,

var zones = this._zoneDataManager.GetZones();   // Write new method in your ZoneDataManager
var zoneDTOs = Mapper.Map<List<Zone>, List<ZoneDTO>>(zones);
IEnumerable<IGrouping<String, ZoneDTO>> zonesToReturn = zoneDTOs.GroupBy(z => z.Country); 

请阅读this。希望这会有所帮助。