2016-06-01 12 views
0

Ich versuche, eine linke äußere auszuführen kommen auf zwei Tabellen basierend auf dem Modell auf dem Bild Database ModelLinq LEFT OUTER JOIN nicht welche Ergebnisse

ich die folgende Linq-Abfrage bin mit:

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 
       }; 

Aber die Ergebnisse sind nicht wie erwartet, es gibt keine Ergebnisse zurück, wenn ein Datensatz mit FechaParada und/oder FechaArranque nicht null ist. Was mache ich hier falsch?

Antwort

1

Ich vermute, dass das Problem durch den folgenden where Zustand verursacht werden:

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

Zunächst einmal, ist es vielleicht nicht für SQL-Abfragen wesentlich sein, aber es ist immer eine gute Praxis, zuerst den null Zustand zu überprüfen, so die oben kann

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

Noch besser reduziert werden, die Filterung auf der rechten Seite der left outer join sollte vor die Verbindung durchgeführt werden, (Für die linke Seite oder inner join es wirklich keine Rolle):

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 
// ... 

In allen Fällen müssen Sie überprüfen, ob Sie wirklich ein Daten erfüllen die FechaParada >= filters.Fecha && FechaArranque <= filters.Fecha Bedingung haben.

+0

Sie sparen meinen Tag. Mit dem ersten Teil Ihrer Antwort funktioniert es wie ein Zauber. Danke – Oscar

+0

@IvanStoev Aber im zweiten Teil der Antwort wo überprüfen Sie, ob das Ergebnis == null? – nam

+0

@nam Da der gesamte Filter vor dem Join angewendet wurde, muss in der Where-Klausel nicht nach result == null gesucht werden. Grundsätzlich (rechts == null || some_condition (rechts)) wird nur benötigt, wenn Sie 'wo' nach dem Join verwenden. –