c# – 使用AutoMapper映射分组集合

我有以下代码不起作用:

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

我一直得到以下异常:

The value
\”System.Collections.Generic.List1[SCGRE.Business.Model.ZoneDTO]\" is
not of type
\"System.Linq.IGrouping
2[System.String,SCGRE.Business.Model.ZoneDTO]\”
and cannot be used in this generic collection.\r\nParameter name:
value

我不明白为什么它试图映射List< T>进入IGrouping< String,T>或者我可能没有正确理解异常…但我基本上有一个IEnumerable< IGrouping< String,Zone>>我想把它映射到IEnumerable< IGrouping< String,ZoneDTO>>

请注意,我已创建从Zone到ZoneDTO的地图,如下所示:

Mapper.CreateMap<Zone, ZoneDTO>();

那是因为两个类的属性几乎完全相同.

有任何想法吗?

解决方法:

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

 Mapper.CreateMap<IEnumerable<IGrouping<String, Zone>>, IEnumerable<IGrouping<String, ZoneDTO>>>()

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

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.希望这会有所帮助.

上一篇:c# – Automapper Convention


下一篇:c# – AutoMapper:PreserveReferences和MaxDepth有什么区别?