私はSQLにLinqを使用しています。私はそれに対してDataContextを持っています。私は.SubmitChanges()です。 IDフィールドを挿入する際にエラーが発生しました。このIDフィールドを挿入するために使用しているクエリが表示されます。LINQ DataContext.SubmitChanges()からTSQLクエリを取得する方法
クイックウォッチ内にクエリ自体が表示されません。どこでデバッガ内から見つけることができますか?
私はSQLにLinqを使用しています。私はそれに対してDataContextを持っています。私は.SubmitChanges()です。 IDフィールドを挿入する際にエラーが発生しました。このIDフィールドを挿入するために使用しているクエリが表示されます。LINQ DataContext.SubmitChanges()からTSQLクエリを取得する方法
クイックウォッチ内にクエリ自体が表示されません。どこでデバッガ内から見つけることができますか?
は実際にあなたはまた、ファイルに出力するためのクエリをあなたのDataContextを設定することができ
((System.Data.Objects.ObjectQuery)myLinqQueryVar).ToTraceString()
多くは、独自の「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のデバッグウィンドウにやっている。この意志の出力のすべてを。
コンソールアプリケーションならさらにPortman's answerに、それは同じくらい簡単です:
myDataContext.Log = Console.Out;
それとも、むしろ優れたツールや仕事のため、実際には右のツールですLinq2SQLプロファイラのようなものを使用することができます:
ここLinq to SQL Profiler - Real-time visual debugger for Linq to SQL
は、詳細な説明は次のとおりです。http://debugmode.net/2011/06/26/logging-in-linq-to-sql/
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);
}
}
}
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();
はちょうどあなたのウォッチウィンドウでこれを貼り付けるあなたの質問に非常に単純な答えがあります。 – eglasius