2011-11-15 14 views
7

Spędziłem ostatnie 2 dni próbując dowiedzieć się, jak zrobić prawdziwe LEWE DOŁĄCZ w LINQ i nie udało mi się. Mam tabela użytkownika, który zawiera kolumnę "Primary2Address", która może i często ma wartość NULL. , więc muszę zrobić LEFT JOIN tutaj. Ponadto w tabeli Adres mam więcej relacji, które mogą mieć wartość NULL, więc muszę wykonać wiele POŁĄCZEŃ LEWYCH.
Każda próba LINQ, którą wykonuję, wypisuje niektóre POWAŻNIE ZŁOŻONE instrukcje sql z UNION, zagnieżdżonymi instrukcjami SELECT i bardziej zwariowanymi rzeczami.
All I need to:Jak wykonać LEFT JOIN w LINQ do encji?

SELECT u.UserName FROM Users u 
LEFT JOIN Addresses a ON a.AddressiD = u.Primary2Address 
LEFT JOIN States s ON s.StateID = a.Address2State 
LEFT JOIN Countries c ON c.CountryID = a.CountryID 

Proszę o pomoc! Do tej pory moim zadaniem było stworzenie procedury składowanej, która używa powyższego wyrażenia sql, ale naprawdę chciałbym spróbować zrobić to za pomocą LINQ (L2E). Dzięki chłopaki!

+3

Jak zapytanie różnią się od po prostu 'SELECT u.UserName od użytkowników u'? – svick

Odpowiedz

18

DefaultIfEmpty służy do lewej dołącza do EntityFramework 4+

var query = from u in context.Users 
      from a in context.Addresses 
          .Where(x => u.Primary2Address == x.AddressiD) 
          .DefaultIfEmpty() 
      from s in context.States 
          .Where(x => a.Address2State == x.StateID) 
          .DefaultIfEmpty() 
      from c in context.Countries 
          .Where(x => a.CountryID == x.CountryID) 
          .DefaultIfEmpty() 
      select u.UserName; 
+0

Jesteś moim bohaterem! Wow, po tylu godzinach ... Twoje zapytanie jest tak proste, jak przychodzą, i otrzymuję je teraz. Dzięki milionowi Aducci! – Losbear

+0

Jak na komentarz @vick's na pytanie, w jaki sposób różni się on od "z u w kontekście. Użytkownicy wybierz u.UserName"? – AakashM

+0

@AakashM - Jeśli dowolny użytkownik ma wiele adresów, otrzymasz inny wynik. Co ważniejsze, myślę, że pytanie zostało uproszczone. – Aducci