viernes, 8 de agosto de 2014

Left Join LINQ vs LAMBDA

Vamos a ver como realizar una consulta con un left join para ambas tecnologías LINQ  y LAMBDA.

Básicamente la consulta que se va hacer es para obtener el correo de un empleado y el de su jefe. Se consultara la tabla USUARIO, en donde en el mismo registro del usuario(empleado) se encuentra el ID del jefe


Consulta con LINQ
var usuario = (from u in context.USUARIO
                         join j in context.USUARIO
                         on u.IdUsuarioSuperior equals j.IdUsuario into salida
                         from jefe in salida.DefaultIfEmpty()
                         where u.IdUsuario == idSolicitante
                         select new
                            {
                                JefeNombre = jefe.Nombre,
                                JefeApellido = jefe.PrimerApellido,
                                EmailJefe = jefe.Email,
                                ColaboradorNombre = u.Nombre,
                                ColaboradorApellido = u.PrimerApellido,
                                EmailColaborador = u.Email,
                                IdColaborador = u.IdUsuario
                            }).FirstOrDefault();
Como ven en la consulta se hace el join normal, la diferencia para que se convierta en un left join lo hace el .DefaultIfEmpty()

Consulta LAMBDA
Para ser sincero no logre hacer el left join con LAMBDA, mi conclusión fue utilizar link para este caso ya que como vemos es más fácil y legible.

De todas formas agregare un join con LAMBDA
                var usuario = context.USUARIO.Where(x => x.IdUsuario == idSolicitante).Join(context.USUARIO, u => u.IdUsuarioSuperior, j => new { j.IdUsuario }.IdUsuario, (u, j)
                            => new
                            {
                                JefeNombre = j.Nombre,
                                JefeApellido = j.PrimerApellido,
                                EmailJefe = j.Email,
                                ColaboradorNombre = u.Nombre,
                                ColaboradorApellido = u.PrimerApellido,
                                EmailColaborador = u.Email,
                                IdColaborador = u.IdUsuario
                            }).FirstOrDefault();
Si bien es cierto que lo necesitaba era un left join para el caso que el empleado no tenga jefes, esto porque si es así el join me va devolver datos vacíos, el objeto usuario terminaría siendo Null. ¿Que se me ocurrió? bueno, utilice un if preguntando si era null, y realizaba otra consulta
if (usuario == null)
                    usuario = context.USUARIO.Where(x => x.IdUsuario == idSolicitante).Select(u
                            => new
                            {
                                JefeNombre = u.Nombre,
                                JefeApellido = u.PrimerApellido,
                                EmailJefe = u.Email,
                                ColaboradorNombre = u.Nombre,
                                ColaboradorApellido = u.PrimerApellido,
                                EmailColaborador = u.Email,
                                IdColaborador = u.IdUsuario
                            }).FirstOrDefault();
Claro, yo no quería tener que consultar la base de datos dos veces por lo que me incline por utilizar LINQ.

Obtener valores
Al utilizar el metodo .FirstOrDefault() me devuelve un objeto con la propiedades de mi consulta, al final consumir ese dato es sencillo
               string correoColaborador = usuario.EmailColaborador;
               string correoJefe = usuario.EmailJefe;
en caso de no usar el .FirstOrDefault() porque nuestra consulta va a traer muchos datos, deberíamos utilizar el .ToList() y recorrer el resultado en un foreach.

Saludos

miércoles, 6 de agosto de 2014

¡Hola!

En este blog traremos de brindar soluciones a problemas cotidianos que a todos nos pasan cuando desarrollamos software, además de dar a conocer nuevas tecnologías, tendencias y buenas practicas en el área.