Linq离开外连接没有返回结果

时间:2016-06-01 09:39:28

标签: c# linq entity-framework-6

我尝试根据图片Database Model上的模型在两张桌子上执行左外连接

我使用以下linq查询:

var query = from u in Context.Set<CpcUnidadProceso>()
            join p in Context.Set<CpcParadasPrevistasUnidad>()
                on u.IdCpcUnidadesProceso equals p.IdCpcUnidadesProceso
                into g
            from result in g.DefaultIfEmpty()
            where u.RefineriaArea.IdTipoArea == filters.IdTipoArea &&
            (result.FechaParada >= filters.Fecha || result == null) && (result.FechaArranque <= filters.Fecha || result == null)
            select
                new CpcPrevisionParadasUnidadesDto
                {
                    IdCpcUnidadesProceso = u.IdCpcUnidadesProceso,
                    CodigoUnidadProceso = u.CodUnidadProceso,
                    DescripcionUnidadProceso = u.Nombre,
                    IdCpcPrevisionParadasUnidadesDto = result == null ? 0 : result.IdCpcParadasPrevistasUnidades,
                    FechaParada = result == null ? null : result.FechaParada,
                    FechaArranque = result == null ? null : result.FechaArranque,
                    Observaciones = result == null ? null : result.Observaciones
                };

但是结果并不像预期的那样,当FechaParada和/或FechaArranque的记录不为空时它没有返回结果。 我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

我怀疑问题是由以下where条件引起的:

(result.FechaParada >= filters.Fecha || result == null) && (result.FechaArranque <= filters.Fecha || result == null)

首先,对于SQL查询可能不是必需的,但首先检查null条件总是一个好习惯,因此上面的内容可以简化为

(result == null || (result.FechaParada >= filters.Fecha && result.FechaArranque <= filters.Fecha))

更好的是,left outer join右侧的过滤应该在 之前执行(对于左侧或inner join它确实无关紧要):

from u in Context.Set<CpcUnidadProceso>()
join p in Context.Set<CpcParadasPrevistasUnidad>()
    .Where(x => x.FechaParada >= filters.Fecha && x.FechaArranque <= filters.Fecha)
on u.IdCpcUnidadesProceso equals p.IdCpcUnidadesProceso
into g
from result in g.DefaultIfEmpty()
where u.RefineriaArea.IdTipoArea == filters.IdTipoArea
// ...

在所有情况下,您必须检查您是否确实拥有满足FechaParada >= filters.Fecha && FechaArranque <= filters.Fecha条件的数据。