如何查看LINQ生成的SQL语句?

它是如何使用ObjectQuery方法完成的?

您可以随时将某些东西附加到DataContext的.Log属性中。 这将显示发送的所有SQL命令。

我在数据访问对象的基础上执行此操作,并将其输出到Visual Studiodebugging控制台。 当对象创build它们的DataContext时,我会检查它是否debugging并附加一个TextWritter助手类,如下所示:

dbDataContext _dB = new dbDataContext(); _dB.CommandTimeout = 5000; #if DEBUG _dB.Log = new DebugTextWriter(); #endif 

以下是用于输出到debugging控制台的帮助程序对象:

 //utility class for output of TextWriter for the Visual Sudio Debug window 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; } } } 

这是我使用ObjectQuery方法发现的。 使用控制台进行testing,您可以执行以下操作:

创build一个扩展方法如下,然后调用它。 说产品产品,然后SQL打印出来作为product.ToTraceString。

 public static class MyExtensions { public static string ToTraceString<T>(this IQueryable<T> t) { string sql = ""; ObjectQuery<T> oqt = t as ObjectQuery<T>; if (oqt != null) sql = oqt.ToTraceString(); return sql; } } 

你可以使用LINQPad 。

您可以查看Linq-to-SQL Debug Visualizer ,或者将鼠标hover在Linq-to-SQL查询上(工具提示应显示生成的SQL),或者访问:

 context.GetCommand(query).CommandText 
  var q = from img in context.Images ... select img; string sql = q.ToString(); 

sql将包含sql select查询。

编辑:缺点:参数目前不会有任何值

您可以运行SQL Server Profiler。

只是一个小小的更新,现在可以使用一个Action来loggingSQL:

 // test SQL logger Action<string> SQLLogger = (message) => System.Diagnostics.Debug.Write(message); _dB.Context().Database.Log = SQLLogger;