Usando AutoMapper para generar proyecciones en Linq to Entities
- 2 min read
##¿Por qué usar AutoMapper? AutoMapper es muy útil si alguna de las siguientes afirmaciones es cierta para ti:
-
Continuamente estas escribiendo código para proyectar o transformar objetos (convertir de entidades a contratos de servicios o DTO’s es común). En ese caso sería común encontrar código como este:
-
No has encontrado alguna manera de rehusar el código de mapeo.
-
Te sería útil seguir una convención para realizar el mapeo de forma más sencilla y evitar la configuración. (No escribir código si las propiedades coinciden o siguen una convención).
##¿Cómo lo uso con Entity Framework? Si nunca antes has usado AutoMapper debes iniciar por instalar el paquete de Nuget.
PM> Install-Package AutoMapper
Registramos las configuraciones que necesitamos para realizar nuestros mapeos (si quieres saber más sobre como configurar el mapeo revisa este link). En el siguiente código registramos el mapeo de nuestra entidad Course a CourseDTO. Generalmente la configuración se realiza una sola vez al inicio de la aplicación y se almacena para su uso posterior.
Cabe resaltar que en este ejemplo no necesito introducir código de mapeo dado que las propiedades en mi objeto DTO coinciden y las que no coinciden una convención de AutoMapper.
###1. Usándolo directamente En donde vayamos a usar el método de extensión de AutoMapper para EntityFramework incluimos el siguiente using.
using AutoMapper.QueryableExtensions;
Y finalmente usamos el método ProjectTo<> para generar la proyección, solo debemos especificarle el tipo de destino y pasarle el objeto de configuración.
###2. Usándolo de forma desacoplada Si usas EntityFramework dentro de algún patrón, como el patrón repositorio, entonces es muy probable que necesites una Expression<Func<TEntity,object>> para pasárselo al repositorio y que este genere la proyección.
Para eso necesitamos hacer uso de una clase definida por AutoMapper en AutoMapper.QueryableExtensions llamada ExpressionBuilder que recibe un objeto de configuración de AutoMapper.
var expressionBuilder = new ExpressionBuilder(config);
Y para genera la expression simplemente le decimos de que tipo a que tipo deseamos hacer el mapeo:
var projection = expressionBuilder.CreateMapExpression<Course, CourseDTO>();
Luego puedes usar la expresion donde quieras (probablemente en un select):
var courses = ctx.Courses.Select(projection).ToList();
##Conclusiones Es altamente recomendable usar AutoMapper para generar proyecciones o convertir entre entidades de dominio y contratos de servicios ya que nos permite reutilizar el código de mapeo, organizarlo y reducirlo considerablemente siguiendo o construyendo nuestra propia convención.
Pueden descargar el proyecto de ejemplo usado en este post aquí.