.NET TIPS

LINQ to SQLのログ出力をVisual Studioの[出力]ウィンドウに出力するには?[3.5、C#、VB]

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

 「LINQ to SQLにより生成されるSQL文を確認するには?」で示しているように、データコンテキスト(DataContext)のLogプロパティの設定により、LINQのクエリから生成される実際のSQL文を標準出力やファイルに出力し確認することができる。

 しかしVisual Studioを使ってコーディングしている場合、そのようなSQL文のログはIDEの[出力]ウィンドウに出力できれば便利である。本稿ではその方法について解説する。

TextWriterクラスの派生クラスでDebugクラスを使用

 データコンテキストのLogプロパティには、抽象クラスであるTextWriterクラス(System.IO名前空間)を継承したクラスのオブジェクトを指定する必要があるが、[出力]ウィンドウに書き込めるようなTextWriterクラスの派生クラスは用意されていない。

 ただし、「VS.NETでデバッグ・メッセージを出力するには?」で解説しているように、Debugクラス(System.Diagnostics名前空間)のWriteLineメソッドなどを使用すれば、[出力]ウィンドウへの文字列の出力は簡単だ。

 従って、Debugクラスを使って文字出力を行う、TextWriterクラスの派生クラスを自分で実装し、そのインスタンスをデータコンテキストのLogプロパティに設定すれば、LINQのログを[出力]ウィンドウに出力させることができる。

 筆者が簡単に試したところ、データコンテキストのログ出力用には、取りあえず文字列を引数に取るWriteLineメソッドをオーバーライドしておけばうまくいくようである。なお、TextWriterクラスではEncodingプロパティが抽象プロパティであるため、これも適当な内容でオーバーライドしておく必要がある。

[出力]ウィンドウにログ出力するサンプル・プログラム

 以下のサンプル・プログラムでは、上述しているTextWriterクラスの派生クラスを「OutputWriterクラス」として実装している。そして「LINQ to SQLにより生成されるSQL文を確認するには?」で作成したサンプル・プログラムにそれを適用している。

using System;
using System.Linq;

namespace ConsoleApplication1
{

#if DEBUG
  class OutputWriter : System.IO.TextWriter
  {
    public override System.Text.Encoding Encoding
    {
      get { return null; }
    }

    public override void WriteLine(string value)
    {
      // [出力]ウィンドウに表示
      System.Diagnostics.Debug.WriteLine(value);
    }
  }
#endif

  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;

#if DEBUG
      dc.Log = new OutputWriter(); // [出力]ウィンドウに出力
#endif

      // 問い合わせ結果の表示
      foreach (var r in records)
      {
        Console.WriteLine(r.OrderID);
        Console.WriteLine(r.Employees.LastName);
      }
      Console.ReadLine();
    }
  }
}
#If DEBUG Then
Public Class OutputWriter
  Inherits System.IO.TextWriter

  Public Overrides ReadOnly Property Encoding() As System.Text.Encoding
    Get
      Return Nothing
    End Get
  End Property

  Public Overrides Sub WriteLine(ByVal value As String)
    ' [出力]ウィンドウに表示
    System.Diagnostics.Debug.WriteLine(value)
  End Sub

End Class
#End If

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

#If DEBUG Then
    dc.Log = New OutputWriter ' [出力]ウィンドウに出力
#End If

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

    Console.ReadLine()
  End Sub

End Module
[出力]ウィンドウにログ出力するLINQのサンプル・プログラム(上:C#、下:VB)
プログラムの実行方法やMainメソッドでの処理については「LINQ to SQLにより生成されるSQL文を確認するには?」を参照してほしい。

 上記のプログラムをデバッグ実行した場合には、[出力]ウィンドウは以下のような表示になる。


[出力]ウィンドウに出力されたLINQクエリのログ(SQL文)

 LINQクエリから生成されたSELECT文が出力されているのが分かる。

 なお、上記サンプル・プログラムでは、#ifディレクティブを用いてデバッグ実行時以外で余計なプログラム・コードが生成されないようにしている。DEBUG定数は(既定では)デバッグ実行時にのみ自動的に定義される定数だ。End of Article

利用可能バージョン:.NET Framework 3.5以降
カテゴリ:クラス・ライブラリ 処理対象:LINQ
カテゴリ:Visual Studio 2008 処理対象:IDE
使用ライブラリ:DataContextクラス(System.Data.Linq名前空間)
使用ライブラリ:TextWriterクラス(System.IO名前空間)
使用ライブラリ:Debugクラス(System.Diagnostics名前空間)
関連TIPS:LINQ to SQLにより生成されるSQL文を確認するには?
関連TIPS:VS.NETでデバッグ・メッセージを出力するには?

この記事と関連性の高い別の.NET TIPS
LINQ to SQLにより生成されるSQL文を確認するには?
VS.NETでデバッグ・メッセージを出力するには?
Console.WriteLineの出力をファイルに書き込むには?
デバッグ・メッセージをコンソールに出力するには?
LINQ文の挙動や生成されるSQL文を確認するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

@IT Special

- PR -

TechTargetジャパン

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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH