C# LINQ to SQL で LEFT OUTER JOIN をシンプルに記述する

LINQ to SQL で LEFT OUTER JOIN (左外部結合) を実現する方法を調べてみると、いくつか方法があることが分かります。

  • O/Rデザイナで関連付け(リレーションシップ)を使用する
  • join句(join ~ in ~ on ~ equals ~ into ~)を使用する
  • GroupJoinメソッドを使用する

まず、O/Rデザイナを使用する方法ですが、データベースのテーブル自体に変更があった場合の処理が面倒なので、私はあまりお勧めしません。

また、Join や GroupJoin を使用する方法もありますが、記載が複雑になる場合が多いので、こちらもお勧めできません。

では、どのようにするのかというと、下のように Join や GroupJoin 使用せずに、from ~ Where ~ DefaultIfEmpty() を使用するとシンプルに記述することができます。

        using (DataClasses1DataContext dc = new DataClasses1DataContext())
        {
            // SQL文をデバッグ出力する為の設定
            dc.Log = new DebugWriter();
        
            // LINQ to SQL で LEFT OUTER JOIN
            var q = from e in dc.EmployeeTable
                    from g in dc.GroupTable.Where(x => x.GroupCode == e.GroupCode).DefaultIfEmpty()
                    select new
                    {
                        e.UserName,
                        e.GroupCode,
                        g.GroupName,
                    };
         
            foreach (var x in q)
            {
                Console.WriteLine(string.Format("{0} : {1}", x.UserName, x.GroupName));
            }
         
            // この時のSQLクエリは下記の通り
            // SELECT [t0].[UserName], [t0].[GroupCode], [t1].[GroupName] AS [GroupName]
            // FROM [dbo].[EmployeeTable] AS [t0]
            // LEFT OUTER JOIN [dbo].[GroupTable] AS [t1] ON [t1].[GroupCode] = [t0].[GroupCode]
        }

なお、上のサンプルのように LINQ to SQL で実際に生成されているSQL文を確認する場合、下のようなクラスを定義して、データコンテキストの Log プロパティにセットしておくことでデバッグウィンドウに出力されます。

        /// <summary>
        /// LINQ to SQL により生成されるSQL文をデバッグ出力するためのクラス
        /// </summary>
        public class DebugWriter : System.IO.TextWriter
        {
            public override System.Text.Encoding Encoding
            {
                get { return null; }
            }
 
            public override void WriteLine(string value)
            {
                System.Diagnostics.Debug.WriteLine(value);
            }
        }
関連する項目:LINQ to SQL で Distinct して OrderBy する
使用環境: Visual Studio 2010 .NET Framework 3.0 以降

C# メニューリスト