使用AutoMapper映射分组集合

Tan*_*ria 5 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);
Run Code Online (Sandbox Code Playgroud)

我一直得到以下异常:

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

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

请注意,我已经从创建的映射ZoneZoneDTO如下:

Mapper.CreateMap<Zone, ZoneDTO>();
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Pra*_*thi 7

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

 Mapper.CreateMap<IEnumerable<IGrouping<String, Zone>>, IEnumerable<IGrouping<String, ZoneDTO>>>()
Run Code Online (Sandbox Code Playgroud)

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

IEnumerable, IEnumerable<T>, ICollection, ICollection<T>, IList, IList<T>, List<T>, Arrays
Run Code Online (Sandbox Code Playgroud)

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); 
Run Code Online (Sandbox Code Playgroud)

请阅读本文.希望这可以帮助.