我使用以下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的记录不为空时它没有返回结果。 我在这里做错了什么?
答案 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
条件的数据。