2011-07-28 190 views
0

我在SQL如下:LINQ to SQL的左外連接

SELECT * FROM (SELECT Teikoku_Sections.Section_ID, Teikoku_Sections.Section_Name, Teikoku_Sections.Section_Code, Teikoku_Sections.Show_In_Menu FROM Teikoku_Sections WHERE Teikoku_Sections.Show_In_Menu = 1) AS Sections 
LEFT OUTER JOIN (SELECT Teikoku_Divisions.Division_ID, Teikoku_Divisions.Division_Name, Teikoku_Divisions.Division_Code, Teikoku_Divisions.Section_ID, Teikoku_Divisions.Show_In_Menu FROM Teikoku_Divisions WHERE Teikoku_Divisions.Show_In_Menu = 1) AS Divisions 
ON Sections.Section_ID = Divisions.Section_ID; 

執行左外連接的兩個表Teikoku_Sections和Teikoku_Divisions並加入兩個表中可見的物品放在一起。

這些表具有以下結構:

Teikoku_Section: SECTION_ID INT, SECTION_NAME爲nvarchar(50), Section_Code INT, Show_In_Menu位

Teikoku_Divisions: Division_ID INT, Division_Name爲nvarchar(50) Division_Code int, Section_ID int,< ==父節的ID Show_In_Menu位

我想結束一個表格,顯示Show_In_Menu爲true的所有部分和分部,但在某些情況下,可能沒有任何部分對應於部分,因此爲LEFT OUTER JOIN。

我只是無法讓我的腦海轉向如何做到這一點在LINQ到SQL。

到目前爲止,我有:

//Get All Visible sections 
    IQueryable<Teikoku_Section> visibleSections = from section in db.Teikoku_Sections where section.Show_In_Menu select section; 
    //Get all visible divisions 
    IQueryable<Teikoku_Division> visibleDivisions = from division in db.Teikoku_Divisions where division.Show_In_Menu select division; 
    //Join the two together 
    IQueryable menuItems = visibleSections.GroupJoin(visibleDivisions, section => section.Section_ID, 
     division => division.Section_ID, (section, divisions) => new 
     { 
      Section_ID = section.Section_ID, 
      Section_Name = section.Section_Name, 
      Division_ID = divisions.Select(d => d.Division_ID), 
      Division_Name = divisions.Select(d => d.Division_Name), 
     }); 

    return menuItems; 

這完全不是那麼回事......我想我可能會錯過的SelectMany(),但我只是想不出哪裏或如何把它。

+0

請格式化您的代碼。 –

+0

@ Kerrek SB:完成,對不起。 –

回答

0

查找到DefaultIfEmpty(http://msdn.microsoft.com/en-us/library/bb355419.aspx)

+0

感謝您的答案,但我不明白這有什麼用處......我上週纔開始使用LINQ to sql,而且大部分時間我仍然很困惑。 –

+0

在101個示例中有一個示例:http://msdn.microsoft.com/en-us/vcsharp/ee908647#leftouterjoin。在你的情況下,如果你只是學習,我會建議在Lambda語法上使用LINQ語法。 IQueryable menuItems =來自可見部分的部分在部分的可見部分中加入joindivision。部分ID等於聯合分區。SectionID從join中加入除法.DefaultIfEmpty()選擇新的{section.Section_ID,section.Section_Name,division.Division_ID,division.Division_Name)}); (當然,你可以抓取一份LINQ in Action並檢查第6章) –

+0

感謝你的兩條評論讓我走上了正確的軌道,並且我解決了它。在你說的linq語法中。我發佈了我的查詢以供將來參考,但將其標記爲答案,因爲我不知道它的含義。謝謝! –

0

結束了在LINQ語法做這個建議由吉姆伍利。我得到的查詢語法如下工作:

IQueryable<Teikoku_Section> visibleSections = from section in db.Teikoku_Sections 
                where section.Show_In_Menu 
                select section; 

    IQueryable<Teikoku_Division> visibleDivisions = from division in db.Teikoku_Divisions 
                where division.Show_In_Menu 
                select division; 

    IQueryable menuItems = from section in visibleSections 
       join division in visibleDivisions on section.Section_ID equals division.Section_ID into joined_SectionDivision 
       from menuItem in joined_SectionDivision.DefaultIfEmpty() 
       select new 
       { 
        Section_ID = section.Section_ID, 
        Section_Name = section.Section_Name, 
        Division_ID = (menuItem == null) ? null : (int?)menuItem.Division_ID, 
        Division_Name = menuItem.Division_Name ?? null 
       }; 

我花了時間,最終得到這個結果,所以這裏有一對夫婦爲任何人誰可能是在相同的情況解釋。

我不想要一個簡單的左外部聯接,而是在兩個表的項目上都有條件的聯接,即Show_In_Menu對於兩個表中的項目都是true,但不一定是同時的,所以一個部分可以是可見的,但是它的分裂可能不會,在這種情況下,我只希望結果中沒有任何分裂的結果部分出現一次。

因爲這個原因,我創建了兩個只包含可見部分和分割項的臨時表,然後使用這兩組結果執行左外部連接。

讓我困惑了一陣子的一件事是.DefaultIfEmpty()部分,它需要處理空聯接的項目。希望這有助於有人試圖做一個左外連接有一天。