如何查看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;