如何从LINQ DataContext.SubmitChanges()获取TSQL查询

我正在使用Linq to SQL。 我有一个DataContext,我就是.SubmitChanges()。 插入标识字段时出错,我希望看到它用于插入此标识字段的查询。

我在快速监视器中看不到查询本身; 我在哪里可以从调试器中找到它?

对你的问题实际上有一个非常简单的答案

只需将其粘贴到您的观察窗口即可

((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-to-Sql在Visual Studio的调试窗口中所做的一切。

继Portman的回答之后 ,如果你是一个控制台应用程序,它就像下面这样简单:

 myDataContext.Log = Console.Out; 

或者你可以使用像Linq2SQL Profiler这样的东西,这是一个相当优秀的工具,实际上是适合这项工作的工具:

Linq to SQL Profiler – Linq to SQL的实时可视化调试器

如果有,请运行SQL事件探查器。 它将显示数据库的所有流量,包括SQL命令文本。

 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(); 

我同意Linq to SQL Profiler是这项工作的正确工具。 但是如果你不想花钱或只是需要做一些简单的事情,我喜欢DebugTextWriter方法。

在阅读完这个问题后,我开始寻找更强大的东西。 事实certificateDamien Guard还写了一篇非常好的文章,关于构建不同的编写器来处理不同的事情,如输出到内存,调试,文件,多个目标,甚至使用简单的代理。

我结束了他的几个想法并编写了一个可以处理多个委托的ActionTextWriter,我想我会在这里分享它:

 using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Writers { public class ActionTextWriter : TextWriter { protected readonly List> Actions = new List>(); public ActionTextWriter(Action action) { Actions.Add(action); } public ActionTextWriter(IEnumerable> actions) { Actions.AddRange(actions); } public ActionTextWriter(params Action[] 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 writeToDebug = s => Debug.Write(s); Action 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); } } } 

以下是详细说明: http : //debugmode.net/2011/06/26/logging-in-linq-to-sql/