2012-10-04 28 views
6

Konwertuję zapytanie SQL do LINQ, które tworzy lewe sprzężenie z mapowaniem 1 do 1, i musi być w składni Metody. Odgarniałem włosy, próbując to osiągnąć bez żadnej zasłony. Mogę to zrobić w składni Lambda. Poniżej znajduje się przykładowe zapytanie, które próbuję uruchomić. Nie są to rzeczywisty kod. Czy ktoś wskazałby, co robię źle?Odpowiednik JOIN i LEFT JOIN w LINQ ze składnią metody

SQL:

SELECT item.*, item_status.* 
FROM item 
LEFT JOIN item_status 
    ON item.ID = item_status.itemID 
    AND item_status.FLAGGED = true 
WHERE item.published_date > "2008-06-19" 

LINQ:

var linq_query = (
    from selected_item in item 
    join selected_item_status in item_status 
     on selected_item.ID equals item_status.itemID into joined 
    from item_status in joined.DefaultIfEmpty() 
    where item_status.FLAGGED = true 
    select new {selected_item, selected_item_status}).ToList(); 
+0

Jak możemy powiedzieć, co jest nie tak z twoim kodem, jeśli nie jest to kod? Czy możemy również zobaczyć klasę "Przedmiot", "item_status" i klasę, w którą wpisujesz listę typu anonimowego? –

Odpowiedz

8

join ... into staje się GroupJoin a drugi from staje się SelectMany:

var linq_query = Item 
    .GroupJoin(
     item_status.Where(x => x.selected_item_status.FLAGGED), // EDIT: Where clause moved here. 
     selected_item => selected_item.ID, 
     selected_item_status => selected_item_status.itemID, 
     (selected_item, joined) => new 
     { 
      selected_item, 
      statuses = joined.DefaultWithEmpty(), 
     }) 
    .SelectMany(x => x.statuses.Select(selected_item_status => new 
    { 
     x.selected_item, 
     selected_item_status, 
    })) 
    // EDIT: Removed where clause. 
    .ToList(); 

Wygląda jak Where sprawia lewy zewnętrzne sprzężenie niepotrzebne, jako n Stany Zjednoczone będą mimo to odfiltrowane.

EDYCJA: Nie, po sprawdzeniu SQL wygląda na to, że zapytanie LINQ jest nieco niepoprawne. Powinno być:

var linq_query = (
    from selected_item in item 
    join selected_item_status 
     in (
      from status in item_status 
      where status.FLAGGED 
      select status) 
     on selected_item.ID equals item_status.itemID into joined 
    from item_status in joined.DefaultIfEmpty() 
    select new {selected_item, selected_item_status}).ToList(); 
+0

Dzięki! Nigdy nie przyszło mi do głowy, że tam na stole jest klauzula WHO. – s1300045

+0

Dziękuję za to - właśnie przyjąłem tę odpowiedź i to jest to, czego szukam. Tak sobie myślę, umieszczając klauzulę where w tym miejscu bardziej podobną do SQ1 niż do linq składni non Method. – EGP