2011-07-28 8 views
0

を外部結合左SQLする:左外側2つのテーブルのTeikoku_SectionsとTeikoku_Divisionsに参加して一緒に、両方のテーブルからの可視アイテムに参加行うLINQの私は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_Section: SECTION_ID INT、 セクション名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)。

私はちょうどSQLにlinqでこれを行う方法に私の頭を回すことができません。

なく、かなりの作業を行い
//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

答えに感謝しますが、私はそれがどのように役立つかわかりません...私は先週SQLにlinqを使い始めましたが、そのほとんどはまだ困惑しています。 –

+0

サンプルは101サンプルあります:http://msdn.microsoft.com/en-us/vcsharp/ee908647#leftouterjoinあなたの場合はちょうどあなたの学習、私はラムダ構文を介してLINQ構文を使用することをお勧めします。 IQueryable menuItems = visibleSectionsのセクションからは、section.SectionIDのvisibleDivisionsのjoindivisionがjoindivisionと等しくなります。SectionIDは、joined.DefaultIfEmpty()のdivisionから結合されたもので、新しい{section.Section_ID、section.Section_Name、division.Division_ID、division.Division_Name}})を選択します。 (もちろん、LINQのコピーを手に取って、第6章もチェックしてください) –

+0

あなたの2つのコメントが私を正しい軌道に乗せてくれて、私はそれを解決しました。あなたが言ったように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ですが、必ずしもそうではないため、セクションを表示できますそれは分割されていない可能性があります。その場合は、結果にセクションが1つだけ表示されるようにします。

このような理由から、私は、目に見えるセクションと除算アイテムだけを持つ2つの一時テーブルを作成し、次にこれらの2つの結果セットを使用して左外部結合を実行しています。

私がしばらく困惑したことの1つは、nullの結合項目を処理するために必要な.DefaultIfEmpty()部分でした。これは、いつか左の外部の参加をしようとしている誰かを助けることを願っています。

関連する問題