2012-11-09 18 views
5

Ho il seguente codice che non funziona:Mappare un insieme raggruppato utilizzando automapper

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

Continuo a ricevere la seguente eccezione:

Il valore \ "System.Collections.Generic. lista 1[SCGRE.Business.Model.ZoneDTO]\" is not of type \"System.Linq.IGrouping 2 [System.String, SCGRE.Business.Model.ZoneDTO] \" e non può essere utilizzato in questa collezione generica \ r \ nParameter nome:. valore

Non capisco il motivo per cui si sta cercando di mappare una List<T> in un IGrouping<String, T> o forse non ho capito l'eccezione correttamente ... Ma io in fondo avere un IEnumerable<IGrouping<String, Zone>> e voglio farlo corrispondere ad IEnumerable<IGrouping<String, ZoneDTO>>

Si noti che ho creato una mappa Zone-ZoneDTO come segue:

Mapper.CreateMap<Zone, ZoneDTO>(); 

E questo perché entrambe le classi hanno quasi esattamente le stesse proprietà.

Qualche idea?

+0

L'ho semplificato e ho eseguito alcuni test unitari e, sfortunatamente, non sembra che l'IGrouping sia attualmente supportato. Se non ottieni alcuna risoluzione da qui, potresti anche provare la [Mailing list di AutoMapper] (https://groups.google.com/forum/?fromgroups#!forum/automapper-users) – Mightymuke

risposta

4

Dopo alcuni lavori arround, credo che non si può fare qualche cosa come

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

Per essere precisi, automapper supporta la raccolta fonte tipi includono: (Solo Generic tipi)

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

automapper volontà non supporta IGrouping perché è un tipo enumerabile non generico.

Invece si può fare il seguente approccio semplice,

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

Si prega di leggere this. Spero che questo ti aiuti.

+1

@TaniaMaria, hai provato con questo approccio? Per favore mi faccia sapere. –

+1

Credo che l'IGrouping sia ora supportato. Sono in grado di mappare correttamente da IGrouping a entityDto; e l'automapper supporta automaticamente i mapping List <> to List <> se sono configurati i singoli mapping –