Ho cercato di creare un modo pulito e riutilizzabile per mappare le entità ai loro DTO. Ecco un esempio di ciò che ho scoperto e in cui sono bloccato.Il modo più semplice per mappare le entità con DTO con Linq Select?
Enti
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
// Other properties not included in DTO
}
public class Address
{
public int ID { get; set; }
public string City { get; set; }
// Other properties not included in DTO
}
DTOs
public class PersonDTO
{
public int ID { get; set; }
public string Name { get; set; }
public AddressDTO Address { get; set; }
}
public class AddressDTO
{
public int ID { get; set; }
public string City { get; set; }
}
Espressioni
Ecco come ho iniziato a gestire la mappatura. Volevo una soluzione che non avrebbe eseguito la query prima della mappatura. Mi è stato detto che se si passa uno Func<in, out>
anziché Expression<Func<in, out>>
che eseguirà la query prima della mappatura.
public static Expressions
{
public static Expression<Func<Person, PersonDTO>> = (person) => new PersonDTO()
{
ID = person.ID,
Name = person.Name,
Address = new AddressDTO()
{
ID = person.Address.ID,
City = person.Address.City
}
}
}
Un problema con questo è che ho già un'espressione che associa un Address
a un AddressDTO
codice in modo che ho duplicato. Questo si interromperà anche se person.Address
è nullo. Questo diventa molto veloce soprattutto se voglio visualizzare altre entità correlate alla persona in questo stesso DTO. Diventa un nido di uccelli di mappature nidificate.
Ho provato quanto segue ma Linq non sa come gestirlo.
public static Expressions
{
public static Expression<Func<Person, PersonDTO>> = (person) => new PersonDTO()
{
ID = person.ID,
Name = person.Name,
Address = Convert(person.Address)
}
public static AddressDTO Convert(Address source)
{
if (source == null) return null;
return new AddressDTO()
{
ID = source.ID,
City = source.City
}
}
}
Ci sono soluzioni eleganti che mi mancano?
automapper:. Http://automapper.org/ – Christian
I Ho usato AutoMapper in precedenza ma ero sotto il presupposto che doveva eseguire la query prima della mappatura. Dopo aver esaminato ulteriormente la documentazione sembra che possa avere qualcosa di simile a quello che sto cercando [QUI] (https: // github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions) – Jeff
La tua query verrà eseguita quando la mappatura viene eseguita ma se ci sono campi nell'entità che non ti interessa usa 'Project(). <>' che è disponibile sia per NHibernate che per EntityFramework. Effettuerà effettivamente un 'select' su campi specificati nelle configurazioni di mappatura. – Christian