LINQ to SQL で LEFT OUTER JOIN (左外部結合) を実現する方法を調べてみると、いくつか方法があることが分かります。
まず、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); } }