Saltar al contenido

¿La forma más limpia de asignar una entidad a DTO con Linq Select?

Solución:

Simplemente use AutoMapper.

Ejemplo:

Mapper.CreateMap<Address, AddressDTO>();
Mapper.CreateMap<Person, PersonDTO>();

Su consulta se ejecutará cuando se realice el mapeo, pero si hay campos en la entidad que no le interesan, use Project().To<> que está disponible tanto para NHibernate como para EntityFramework. Efectivamente, hará una selección en los campos especificados en las configuraciones de mapeo.

Si desea crear asignaciones manualmente, puede usar Seleccionar en la colección de la siguiente manera:

Algunos datos de prueba:

    var persons = new List<Person>
    {
        new Person() {ID = 1, Name = "name1", Address = new Address() {ID = 1, City = "city1"}},
        new Person() {ID = 2, Name = "name2", Address = new Address() {ID = 2, City = "city2"}},
        new Person() {ID = 3, Name = "name3", Address = new Address() {ID = 1, City = "city1"}}
    };

Métodos de mapeo:

    public static PersonDTO ToPersonDTOMap(Person person)
    {
        return new PersonDTO()
        {
            ID = person.ID,
            Name = person.Name,
            Address = ToAddressDTOMap(person.Address)
        };
    }

    public static AddressDTO ToAddressDTOMap(Address address)
    {
        return new AddressDTO()
        {
            ID = address.ID,
            City = address.City
        };
    }

Uso actual:

var personsDTO = persons.Select(x => ToPersonDTOMap(x)).ToList();

Tenga en cuenta que si se tratara de una consulta real, no se ejecutaría siempre que fuera IQueryable, se ejecutaría una vez que la materialice (usando ToList () por ejemplo).

Sin embargo, consideraría usar algún marco que pudiera hacerlo (las asignaciones) automáticamente (si su asignación es tan simple como el ejemplo proporcionado (.

Puede usar AutoMapper o escribir métodos de extensión como estos:

public static class PersonMapper
{
    public static PersonDTO ConvertToDTO(this Person person)
    {
        return new PersonDTO { ID = person.ID, Name = person.Name, Address = person.Address.ConvertToDTO() };
    }

    public static IEnumerable<PersonDTO> ConvertToDTO(this IEnumerable<Person> people)
    {
        return people.Select(person => person.ConvertToDTO());
    }
}

public static class AddressMapper
{
    public static AddressDTO ConvertToDTO(this Address address)
    {
        return new AddressDTO { ID = address.ID, City = address.City };
    }

    public static IEnumerable<AddressDTO> ConvertToDTO(this IEnumerable<Address> addresses)
    {
        return addresses.Select(address => address.ConvertToDTO());
    }
}

A continuación, podría mapear un Person objetar a un PersonDTO objeto como este:

public class Program
{
    static void Main(string[] args)
    {
        Person person = new Person { ID = 1, Name = "John", Address = new Address { ID = 1, City = "New Jersey" } };
        PersonDTO personDTO = person.ConvertToDTO();
        Console.WriteLine(personDTO.Name);
    }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *