如何查看LINQ生成的SQL语句?
使用ObjectQuery方法是如何完成的?您可以查看,或者将鼠标悬停在Linq to SQL查询上(工具提示应显示生成的SQL),或者访问:如何查看LINQ生成的SQL语句?,linq,Linq,使用ObjectQuery方法是如何完成的?您可以查看,或者将鼠标悬停在Linq to SQL查询上(工具提示应显示生成的SQL),或者访问: context.GetCommand(query).CommandText 您始终可以将某些内容附加到DataContext的.Log属性。这将在发送时显示所有SQL命令 我在数据库中为数据访问对象执行此操作,并将其输出到VisualStudio调试控制台。当对象创建其DataContext时,我检查它是否调试并附加TextWriter帮助程序类,如下
context.GetCommand(query).CommandText
您始终可以将某些内容附加到DataContext的.Log属性。这将在发送时显示所有SQL命令 我在数据库中为数据访问对象执行此操作,并将其输出到VisualStudio调试控制台。当对象创建其DataContext时,我检查它是否调试并附加TextWriter帮助程序类,如下所示:
dbDataContext _dB = new dbDataContext();
_dB.CommandTimeout = 5000;
#if DEBUG
_dB.Log = new DebugTextWriter();
#endif
以下是用于输出到调试控制台的帮助对象:
//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方法发现的内容。使用console进行测试,可以执行以下操作: 创建一个扩展方法,如下所示,然后调用它。说Product,然后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;
}
}
公共静态类MyExtensions
{
公共静态字符串ToTraceString(此iQueryTable t)
{
字符串sql=“”;
ObjectQuery oqt=t作为ObjectQuery;
如果(oqt!=null)
sql=oqt.ToTraceString();
返回sql;
}
}
您可以运行SQL Server探查器
var q = from img in context.Images
...
select img;
string sql = q.ToString();
sql
将包含sql选择查询
编辑:缺点:参数此时将没有任何值只需一个小更新,您现在可以使用操作来记录SQL:
// test SQL logger
Action<string> SQLLogger = (message) => System.Diagnostics.Debug.Write(message);
_dB.Context().Database.Log = SQLLogger;
//测试SQL记录器
操作SQLLogger=(消息)=>System.Diagnostics.Debug.Write(消息);
_dB.Context().Database.Log=SQLLogger;
这是我在设置数据库上下文时使用的:
this.DbContext.Database.Log += s => Debug.WriteLine(s);
如果要对数据库执行linq查询,可以运行SQL探查器来记录正在执行的SQL查询。我们经常这样做是为了确定对转换的任何性能影响。我还没有尝试过这个GetCommand。我喜欢Scott Gu的链接!Visualizer是内置的Visual Studio 2010吗?@nellbryant:不,它仍然是一个单独的扩展,您需要从VS Gallery中获取它也可以在VS Watch窗口中使用:
((ObjectQuery)myQuery).ToTraceString()
。不错!那么像Count
这样的聚合方法呢?我认为在使用dbContext时不起作用,因为在这种情况下,您不能将IQueryable强制转换为ObjectQuery。对于那些使用Entity Framework 6 check的人,希望能帮到一些人。您可以使用context.Log=Console.Out代码>这很简单如果您在本地调试并使用SQL Server,请运行SQL探查器。包含所有参数的查询将显示在那里。如果使用SQL事件探查器,为了确保从VS调试会话捕获所有LINQ查询,请使用SQL事件探查器“RPC Completed”和“SQL:BatchCompleted”事件。