C# Linq左外部联接不返回结果
我试图根据图片上的模型在两个表上执行左外连接 我正在使用以下linq查询:C# Linq左外部联接不返回结果,c#,linq,entity-framework-6,C#,Linq,Entity Framework 6,我试图根据图片上的模型在两个表上执行左外连接 我正在使用以下linq查询: var query = from u in Context.Set<CpcUnidadProceso>() join p in Context.Set<CpcParadasPrevistasUnidad>() on u.IdCpcUnidadesProceso equals p.IdCpcUnidadesProceso
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
};
var query=来自Context.Set()中的u
在Context.Set()中连接p
关于u.IdcpunidaDesproceso等于p.IdcpunidaDesproceso
进入g
从g.DefaultIfEmpty()中的结果
其中u.RefineriaArea.IdTipoArea==filters.IdTipoArea&&
(result.FechaParada>=filters.Fecha | | result==null)和&(result.FechaArranque我怀疑问题是由以下条件引起的,其中条件:
(result.FechaParada >= filters.Fecha || result == null) && (result.FechaArranque <= filters.Fecha || result == null)
更好的是,左侧外部联接
右侧的过滤应该在联接之前执行(对于左侧联接或内部联接
,实际上并不重要):
来自Context.Set()中的u
在Context.Set()中连接p
哪里(x=>x.FechaParada>=filters.Fecha&&x.FechaArranque=filters.Fecha&&FechaArranque你救了我一天。只需使用你答案的第一部分,它就像一个符咒。Thanks@IvanStoev但是在你答案的第二部分,你在哪里检查结果==null?@nam因为在进行连接之前已经应用了整个过滤器,所以没有不需要在where子句中检查result==null。基本上(right==null | | some_条件(right))仅当您在联接后使用where
时才需要。@IvanStoev但是,在您的第二个解决方案中,我们不是忽略了左外联接的定义吗?在where子句中,我们只取两边联接的行。@nam它仍然是左外联接。联接操作后应用筛选器的问题考虑到右侧可以为空,w/o有效地将左侧外部联接转换为内部联接。当预先应用右侧筛选器和执行左侧外部联接时,您可以在不需要空逻辑的情况下获得正确的结果。
(result == null || (result.FechaParada >= filters.Fecha && result.FechaArranque <= filters.Fecha))
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
// ...