2012-11-09 14 views
5

Mam następujący kod, który nie działa:Mapowanie pogrupowany zbiór używając AutoMapper

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

Wciąż otrzymuję następujący wyjątek:

Wartość \ "System.Collections.Generic. Lista 1[SCGRE.Business.Model.ZoneDTO]\" is not of type \"System.Linq.IGrouping 2 [system.string, SCGRE.Business.Model.ZoneDTO] \” i nie mogą być używane w tym generycznych kolekcji \ r \ nParameter nazwa. wartość

Nie rozumiem, dlaczego stara się odwzorować List<T> do wiadomości IGrouping<String, T> czy może ja nie rozumiem wyjątek właściwie ... Ale ja w zasadzie mieć IEnumerable<IGrouping<String, Zone>> i chcę mapować go IEnumerable<IGrouping<String, ZoneDTO>>

Należy pamiętać, że Stworzyłem mapę z Zone do ZoneDTO następująco:

Mapper.CreateMap<Zone, ZoneDTO>(); 

a to dlatego, że obie klasy mają prawie dokładnie te same właściwości.

Wszelkie pomysły?

+0

Uprościliśmy to i przeprowadziłem kilka testów jednostkowych, a niestety nie wygląda to na to, że IGrouping jest obecnie obsługiwany. Jeśli nie uzyskasz tutaj odpowiedzi, możesz również wypróbować [Listę wysyłkową AutoMapper] (https://groups.google.com/forum/?fromgroups#!forum/automapper-users) – Mightymuke

Odpowiedz

4

Po jakimś pracy arround, myślę, że nie można zrobić kilka rzeczy, jak

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

Mówiąc konkretnie, AutoMapper wspiera zbiór źródłowy typy to: (tylko Generic modele)

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

AutoMapper będzie nie obsługuje IGrouping, ponieważ jest nietypowym przeliczalnym typem.

Zamiast tego można wykonać następujące proste podejście,

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); 

Proszę przeczytać this. Mam nadzieję że to pomoże.

+1

@TaniaMaria, czy próbowałeś z tym podejście? Proszę daj mi znać. –

+1

Wierzę, że funkcja IGrouping jest teraz obsługiwana. Jestem w stanie skutecznie zmapować z IGrouping do entityDto; i automapper automatycznie obsługuje mapowanie listy <> do listy <>, jeśli skonfigurowane są pojedyncze odwzorowania –