2012-07-17 11 views
5

Mam problemy z określeniem składni dla lewego sprzężenia zewnętrznego w wielu sprzężeniach. Chcę zrobić lewe złącze na tabeli RunLogEntry, aby uzyskać rekordy pasujące do tej tabeli, a także wszystkie wpisy usługi.Wymagana korekcja składni linq lewej wymaga

Czy ktoś może poprawić mój 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 .... spróbuj 'left przyłączyć rw db.RunLogEntry na se.RunLogEntryID równa r.ID' – MikeTWebb

+0

@MikeTWebb - w Linq nie ma bezpośredniej składni lewostronnej. –

+0

@ Stanley ... sprawdź ten link http://codingsense.wordpress.com/2009/03/08/left-join-right-join-using-linq/ Czy popełniłem błąd? – MikeTWebb

Odpowiedz

5

Użyj metody .DefaultIfEmpty na r wykonać LEFT JOIN:

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, dziękuję, że twoje rozwiązanie działa, znalazłem rozwiązanie również, ale twój wygląda lepiej – user1475788

+0

Myślę, że napisałem coś źle w moim pierwotnym pytaniu, chcę uzyskać wszystkie wpisy usług wraz z tymi wpisami usług, które mają dopasowania w tabeli wpisów runlog. W powyższym otrzymuję zapisy, których nie powinno tam być. – user1475788

+0

Edytowałem swoją odpowiedź. Sprawdź, czy to daje właściwe rezultaty. –

Powiązane problemy