.NET TIPS

LINQ to SQLにより生成されるSQL文を確認するには?[3.5、C#、VB]

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

 データベースに対してLINQ(リンク)を使用する場合、LINQのクエリはLINQプロバイダであるSQL to LINQによりSQL文に変換され、データベースに送信される。このとき、実際にどのようなSQL文が生成されているのかを確認するには、データコンテキスト(DataContext)の「Logプロパティ」を利用する。

 LogプロパティはTextWriter型(System.IO名前空間)のプロパティである。つまり、適当なTextWriterオブジェクト(あるいはTextWriterクラスの派生クラスであるStreamWriterクラスなどのオブジェクト)をセットしておけば、データコンテキスト内部で、そのWriteLineメソッドなどが使用されてログが出力されるという仕組みだ。

■標準出力ストリームに出力する場合

 生成されるSQL文を標準出力ストリーム(つまりはコマンド・プロンプト)に出力したい場合には、LogプロパティにConsole.Outプロパティの値をセットすればよい。

 以下にそのサンプル・プログラムを示す。

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; // 標準出力にログを出力

      // 問い合わせ結果の表示
      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 ' 標準出力にログを出力

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

    Console.ReadLine()
  End Sub

End Module
標準出力にログ出力するLINQのサンプル・プログラム(上:C#、下:VB)
このサンプル・プログラムを実行するには、Visual Studio 2008でコンソール・アプリケーションのプロジェクトを作成し、O/Rデザイナを使用してデータコンテキストを作成する必要がある。これについての手順は「特集:C#プログラマーのためのLINQ超入門(後編) LINQによるデータベース・アクセスとO/Rマッピング」を参照していただきたい。O/Rデザイナでは、NorthWindデータベースからOrdersテーブルとEmployeesテーブルの2つを追加する。

 このサンプル・プログラムをVisual Studio 2008で実行すると、表示されるコンソール・ウィンドウは以下の画面のようになる。この場合には、合計で4つのSELECT文が生成されているのが分かる。なお、生成されるSELECT文が1つでないのは、上記リストの の「r.Employees.LastName」によるもので、Ordersテーブルでの検索結果を基にEmployeesテーブルを検索することになるためである。


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

■ファイルに出力する場合

 SQL文を画面ではなくファイルに出力したい場合には、ファイルに対するストリームをStreamWriterクラス(System.IO名前空間)などで作成しておき、それをLogプロパティに設定すればよい。以下にそのサンプル・プログラムを示す。このプログラムでは「c:\log.txt」にログを出力している。

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;

      using (var sw = new StreamWriter(@"c:\log.txt", true))
      {
        dc.Log = sw; // ファイルにログを出力

        // 問い合わせ結果の表示
        foreach (var r in records)
        {
          Console.WriteLine(r.OrderID);
          Console.WriteLine(r.Employee.LastName);
        }
      }
      Console.ReadLine();
    }
  }
}
Imports System.IO

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

    Using sw As New StreamWriter("c:\log.txt")

      dc.Log = sw ' ファイルにログを出力

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

    Console.ReadLine()
  End Sub

End Module
ファイルにログ出力するLINQのサンプル・プログラム(上:C#、下:VB)
このサンプル・プログラムでは、c:\log.txtにログを出力する。

 ところで、Visual Studioで開発している場合には、ログの内容(SQL文)が[出力]ウィンドウに出力されれば便利である。Windowsフォーム・アプリケーションの場合には、上記の方法で標準出力に出力すれば、それは[出力]ウィンドウに送られるが、コンソール・アプリケーションやASP.NETアプリケーションではそうはならない。

 LINQのログ出力をVisual Studioの[出力]ウィンドウに出力する方法については、次週に解説する予定だ。End of Article

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

この記事と関連性の高い別の.NET TIPS
LINQ to SQLのログ出力をVisual Studioの[出力]ウィンドウに出力するには?
[LINQ to SQL]関連するテーブル内容を先に読み込んでおくには?
LINQ文の挙動や生成されるSQL文を確認するには?
コンソール・アプリケーションの出力を取り込むには?
Console.WriteLineの出力をファイルに書き込むには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間