2009-03-12 15 views
13

私はSQLにLinqを使用しています。私はそれに対してDataContextを持っています。私は.SubmitChanges()です。 IDフィールドを挿入する際にエラーが発生しました。このIDフィールドを挿入するために使用しているクエリが表示されます。LINQ DataContext.SubmitChanges()からTSQLクエリを取得する方法

クイックウォッチ内にクエリ自体が表示されません。どこでデバッガ内から見つけることができますか?

+0

はちょうどあなたのウォッチウィンドウでこれを貼り付けるあなたの質問に非常に単純な答えがあります。 – eglasius

答えて

8

は実際にあなたはまた、ファイルに出力するためのクエリをあなたのDataContextを設定することができ

((System.Data.Objects.ObjectQuery)myLinqQueryVar).ToTraceString() 
+0

残念ながら、それは常に機能しません。あなたの質問にはグループバイがあります。 – bobzer

+0

あなたはlinqtosqlを試してみましたか? –

+0

答えはあなたのエンティティ・フレームワークの多くがバージョン4.1から依存しています。これはcontext.Logを実装しているdbcontextを持っていますので、上記の解決方法を使用することができます。残念ながらそれは常に利用可能ではありません – bobzer

3

SQLプロファイラがある場合は実行します。 SQLコマンドテキストを含む、データベースへのすべてのトラフィックを表示します。人々の

+0

ありがとうございます。それは動作します。しかし、私はVSからそれを見ることを望んでいた。 – tsilb

+0

SQLプロファイラは、他の理由からも便利です。たとえば、コードがDB上に置いている負荷を確認します。 – geofftnz

20

多くは、独自の「DebugWriter」を書き込むと、そのようにそれを装着されています:

// Add this class somewhere in your project... 
class DebugTextWriter : System.IO.TextWriter { 
    public override void Write(char[] buffer, int index, int count) { 
     System.Diagnostics.Debug.Write(new String(buffer, index, count)); 
    } 

    public override void Write(string value) { 
     System.Diagnostics.Debug.Write(value); 
    } 

    public override Encoding Encoding { 
     get { return System.Text.Encoding.Default; } 
    } 
} 

// Then attach it to the Log property of your DataContext... 
myDataContext.Log = new DebugTextWriter() 

LINQのツーSQLのは、Visual Studioのデバッグウィンドウにやっている。この意志の出力のすべてを。

0

Linq to SQL Profilerがこの仕事のための適切なツールであることに同意します。しかし、お金を使いたくない、あるいは何かを単純にする必要があるのであれば、私はDebugTextWriterアプローチが好きです。

この質問を読んだ後、私はもっと頑丈なものを探しました。メモリ、デバッグ、ファイル、複数の出力先、または単純なデリゲートを使用して出力するようなさまざまなことに対処するために、異なるライターを構築することについては、Damien Guardもまたwrote a very nice articleです。

私は彼のアイデアのカップルを使用して巻き取ると、複数のデリゲートを扱うことができるActionTextWriterを書いて、私はここでそれを共有するだろうと思った:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 

namespace Writers 
{ 
    public class ActionTextWriter : TextWriter 
    { 
     protected readonly List<Action<string>> Actions = new List<Action<string>>(); 

     public ActionTextWriter(Action<string> action) 
     { 
      Actions.Add(action); 
     } 

     public ActionTextWriter(IEnumerable<Action<string>> actions) 
     { 
      Actions.AddRange(actions); 
     } 

     public ActionTextWriter(params Action<string>[] actions) 
     { 
      Actions.AddRange(actions); 
     } 

     public override Encoding Encoding 
     { 
      get { return Encoding.Default; } 
     } 

     public override void Write(char[] buffer, int index, int count) 
     { 
      Write(new string(buffer, index, count)); 
     } 

     public override void Write(char value) 
     { 
      Write(value.ToString()); 
     } 

     public override void Write(string value) 
     { 
      if (value == null) 
      { 
       return; 
      } 

      foreach (var action in Actions) 
      { 
       action.Invoke(value); 
      } 
     } 
    } 
} 

あなたが好きなようにあなたはできるだけ多くのアクションを追加することができます。この例では、Debug.Write経由でのVisual Studioでのログファイルとコンソールに書き込み:あなたはシンプルなものがカフをオフに使用するようにしたい場合は

// Create data context 
var fooDc = new FooDataContext(); 

// Create writer for log file. 
var sw = new StreamWriter(@"C:\DataContext.log") {AutoFlush = true}; 

// Create write actions. 
Action<string> writeToDebug = s => Debug.Write(s); 
Action<string> writeToLog = s => sw.Write(s); 

// Wire up log writers. 
fooDc.Log = new ActionTextWriter(writeToDebug, writeToLog); 

そしてもちろん、あなたは常に ActionTextWriterを拡張することができます。..一般的なアプローチを書いて再利用するのですか?

using System.Diagnostics; 
using System.IO; 

namespace Writers 
{ 
    public class TraceTextWriter : ActionTextWriter 
    { 
     public TraceTextWriter() 
     { 
      Actions.Add(s => Trace.Write(s)); 
     } 
    } 

    public class FileTextWriter : ActionTextWriter 
    { 
     public FileTextWriter(string path, bool append = false) 
     { 
      var sw = new StreamWriter(path, append) {AutoFlush = true}; 
      Actions.Add(sw.Write); 
     } 
    } 
} 
1
FooDataContext dc = new FooDataContext(); 

StringBuilder sb = new StringBuilder(); 
dc.Log = new StringWriter(sb); 

var result=from r in dc.Tables select d; 

..... 
string query=sb.ToString(); 
関連する問題