.NET TIPS

[LINQ to SQL]関連するテーブル内容を先に読み込んでおくには?[3.5、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2009/10/29

 「TIPS:LINQ to SQLにより生成されるSQL文を確認するには?」に掲載しているサンプル・プログラムでは、その実行結果から分かるように、以下のような1つのクエリの実行に関して、合計で5つのSELECT文が実行されている。

// LINQによる問い合わせ
var records =
          from n in dc.Orders
          where n.ShipCountry == "Norway"
          select n;
' LINQによる問い合わせ
Dim records = _
          From n In dc.Orders _
          Where n.ShipCountry = "Norway" _
          Select n
サンプル・プログラムのクエリ部分(上:C#、下:VB)

 これはクエリ結果の表示時に、以下のようにして、クエリ対象であるOrdersテーブルに関連付けられた、別のテーブルであるEmployeesテーブルのレコードにもアクセスしているためだ( の行)。

// 問い合わせ結果の表示
foreach (var r in records)
{
  Console.WriteLine(r.OrderID);
  Console.WriteLine(r.Employees.LastName);
}
' 問い合わせ結果の表示
For Each r In records
  Console.WriteLine(r.OrderID)
  Console.WriteLine(r.Employees.LastName)
Next
サンプル・プログラムのクエリ結果表示部分(上:C#、下:VB)

 このコードのように、関連のある別テーブルに頻繁にアクセスすることがあらかじめ分かっている場合には、その別テーブルのレコードも(最初のSELECT文発行時に)同時に取得するように指定できる。これにはデータコンテキストのLoadOptionsプロパティを指定する。

データコンテキストのLoadOptionsプロパティ

 データコンテキストのLoadOptionsプロパティには、DataLoadOptionsクラス(System.Data.Linq名前空間)のオブジェクトを指定する。このオブジェクトでは、LoadWithメソッドを使って、同時に取得するデータを指定する。

 例えば、クエリ対象となるテーブルが「Orders」で、これと同時にデータを取得したい関連するテーブルが「Employees」の場合、DataLoadOptionsクラスをインスタンス化し、LoadWithメソッドを呼び出す部分のコードは次のようになる。

// Employeesテーブルの即時読み込み
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Orders>(o => o.Employees);
' Employeesテーブルの即時読み込み
Dim dlo As New DataLoadOptions()
dlo.LoadWith(Of Orders)(Function(o As Orders) o.Employees)
DataLoadOptionsクラスのインスタンス化の例(上:C#、下:VB)
LoadWithメソッドの引数は、ラムダ式を使用している。

 このコードを、「TIPS:LINQ to SQLにより生成されるSQL文を確認するには?」のサンプル・プログラムに適用すると次のようになる。

using System;
using System.Linq;

using System.IO;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      // NorthWindDataContextクラスはVS 2008により自動生成
      NorthWindDataContext dc = new NorthWindDataContext();

      // LINQによる問い合わせ
      var records =
          from n in dc.Orders
          where n.ShipCountry == "Norway"
          select n;

      dc.Log = Console.Out; // 標準出力にログを出力

      // Employeesテーブルの即時読み込み
      DataLoadOptions dlo = new DataLoadOptions();
      dlo.LoadWith<Orders>(o => o.Employees);
      dc.LoadOptions = dlo;

      // 問い合わせ結果の表示
      foreach (var r in records)
      {
        Console.WriteLine(r.OrderID);
        Console.WriteLine(r.Employees.LastName);
      }
      Console.ReadLine();
    }
  }
}
Module Module1

  Sub Main()

    ' NorthWindDataContextクラスはVS 2008により自動生成
    Dim dc As New NorthWindDataContext()

    ' LINQによる問い合わせ
    Dim records = _
      From n In dc.Orders _
      Where n.ShipCountry = "Norway" _
      Select n

    dc.Log = Console.Out ' 標準出力にログを出力

    ' Employeesテーブルの即時読み込み
    Dim dlo As New DataLoadOptions()
    dlo.LoadWith(Of Orders)(Function(o As Orders) o.Employees)
    dc.LoadOptions = dlo

    ' 問い合わせ結果の表示
    For Each r In records
      Console.WriteLine(r.OrderID)
      Console.WriteLine(r.Employees.LastName)
    Next

    Console.ReadLine()
  End Sub

End Module
OrdersテーブルとEmployeesテーブルを同時に読み込むサンプル・プログラム(上:C#、下:VB)
TIPS:LINQ to SQLにより生成されるSQL文を確認するには?」のサンプル・プログラムを修正している。このコードの実行方法については、そちらのTIPSを参照してほしい。

 このコードの実行結果は次のようになる。


上記サンプル・プログラムの実行結果例

 この画面から、発行されているSELECT文が1つだけになっているのを確認できる。また、SELECT文ではOrdersテーブルとEmployeesテーブルの両方のデータを取得しているのも確認できる。End of Article

利用可能バージョン:.NET Framework 3.5以降
カテゴリ:クラス・ライブラリ 処理対象:LINQ
使用ライブラリ:DataContextクラス(System.Data.Linq名前空間)
使用ライブラリ:DataLoadOptionsクラス(System.Data.Linq名前空間)

この記事と関連性の高い別の.NET TIPS
LINQ to SQLにより生成されるSQL文を確認するには?
LINQ to SQLのログ出力をVisual Studioの[出力]ウィンドウに出力するには?
LINQ文の挙動や生成されるSQL文を確認するには?
[ADO.NET]複数のselect文をまとめて実行するには?
[ASP.NET]Repeaterコントロールでネストされたデータを表現するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間