2012-07-17 16 views
5

Tengo problemas para entender la sintaxis Linq para una combinación externa izquierda dentro de varias uniones. Quiero hacer una combinación a la izquierda en RunLogEntry Tabla para obtener los registros que coinciden de esta tabla, así como todas las entradas de servicio.Linq left join sintaxis correction needed

¿Puede alguien corregir mi snytax?

var list = (from se in db.ServiceEntry 
    join u in db.User on se.TechnicianID equals u.ID 
    join s in db.System1 on se.SystemID equals s.ID 
    join r in db.RunLogEntry on se.RunLogEntryID equals r.ID 
    where se.ClosedDate.HasValue == false 
    where se.ClosedDate.HasValue == false 
     && se.Reconciled == false 
    orderby se.ID descending 
    select new ServiceSearchEntry() 
    { 
     ID = se.ID, 
     ServiceDateTime = se.ServiceDateTime, 
     Technician = u.FullName, 
     System = s.SystemFullName, 
     ReasonForFailure = se.ReasonForFailure, 
     RunDate = r.RunDate 
    }) 
    .Skip((page - 1) * PageSize); 
+0

@user .... tratar 'izquierda unirse a R en db.RunLogEntry en se.RunLogEntryID es igual a r.ID' – MikeTWebb

+0

@MikeTWebb - no hay sintaxis de unión directa a la izquierda en Linq. –

+0

@D Stanley .... echa un vistazo a este enlace http://codingsense.wordpress.com/2009/03/08/left-join-right-join-using-linq/ ¿He cometido un error? – MikeTWebb

Respuesta

5

utilizar el método de .DefaultIfEmpty en r para realizar una combinación izquierda:

var list = (from se in db.ServiceEntry 
    join r in db.RunLogEntry on se.RunLogEntryID equals r.ID into joinRunLogEntry 
    from r2 in joinRunLogEntry.DefaultIfEmpty() 
    join u in db.User on se.TechnicianID equals u.ID 
    join s in db.System1 on se.SystemID equals s.ID 
    where se.ClosedDate.HasValue == false 
    where se.ClosedDate.HasValue == false 
     && se.Reconciled == false 
    orderby se.ID descending 
    select new ServiceSearchEntry() 
    { 
     ID = se.ID, 
     ServiceDateTime = se.ServiceDateTime, 
     Technician = u.FullName, 
     System = s.SystemFullName, 
     ReasonForFailure = se.ReasonForFailure, 
     RunDate = (r2 == null ? (DateTime?)null : r2.RunDate) 
    }) 
    .Skip((page - 1) * PageSize); 
+0

@Stanley, gracias a que su solución funciona, encontré una solución también pero la suya se ve mejor – user1475788

+0

Creo que he publicado algo incorrecto en mi pregunta original, quiero obtener todas las entradas de servicio junto con las entradas de servicio que tienen coincidencias en la tabla de entrada de registro de ejecución. En lo anterior, obtengo registros que no deberían estar allí. – user1475788

+0

He editado mi respuesta. Vea si eso le da los resultados correctos. –