问题
I have the following code which is not working:
var groupedZones = this._zoneDataManager.GetZonesGroupedByCountry();
IEnumerable<IGrouping<String, ZoneDTO>> zonesToReturn = Mapper.Map<IEnumerable<IGrouping<String, Zone>>, IEnumerable<IGrouping<String, ZoneDTO>>>(groupedZones);
I keep getting the following exception:
The value \"System.Collections.Generic.List
1[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
I do not understand why it is trying to map a List<T>
into an IGrouping<String, T>
or maybe I did not understand the exception properly... But I basically have an IEnumerable<IGrouping<String, Zone>>
and I want to map it to IEnumerable<IGrouping<String, ZoneDTO>>
Note that I have created a map from Zone
to ZoneDTO
as follows:
Mapper.CreateMap<Zone, ZoneDTO>();
And that's because both classes have almost exactly the same properties.
Any ideas?
回答1:
After some work arround, I guess you cannot do some thing like
Mapper.CreateMap<IEnumerable<IGrouping<String, Zone>>, IEnumerable<IGrouping<String, ZoneDTO>>>()
To be specific, AutoMapper supports the source collection types include: (Only Generic
types)
IEnumerable, IEnumerable<T>, ICollection, ICollection<T>, IList, IList<T>, List<T>, Arrays
AutoMapper will not support IGrouping
because it is non-generic enumerable type.
Instead you can do the following simple approach,
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);
Please read this. Hope this helps.
来源:https://stackoverflow.com/questions/13305391/mapping-a-grouped-collection-using-automapper