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
var usuario = (from u in context.USUARIOComo ven en la consulta se hace el join normal, la diferencia para que se convierta en un left join lo hace el .DefaultIfEmpty()
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();
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)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
=> new
{
JefeNombre = j.Nombre,
JefeApellido = j.PrimerApellido,
EmailJefe = j.Email,
ColaboradorNombre = u.Nombre,
ColaboradorApellido = u.PrimerApellido,
EmailColaborador = u.Email,
IdColaborador = u.IdUsuario
}).FirstOrDefault();
if (usuario == null)Claro, yo no quería tener que consultar la base de datos dos veces por lo que me incline por utilizar LINQ.
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();
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;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.
string correoJefe = usuario.EmailJefe;
Saludos
