使用实体框架CTP5“时,如何获取LINQ查询的原始SQL?”;“仅代码”吗;?

使用实体框架CTP5“时,如何获取LINQ查询的原始SQL?”;“仅代码”吗;?,sql,entity-framework,profiling,code-first,ef4-code-only,Sql,Entity Framework,Profiling,Code First,Ef4 Code Only,我已经在“仅代码”模式下使用了实体框架CTP5。我正在对从数据库返回的对象运行LINQ查询,因为查询运行得非常慢。是否有任何方法可以获取从查询生成的SQL语句 Topic currentTopic = (from x in Repository.Topics let isCurrent = (x.StoppedAt <= x.StartedAt || (x.StartedAt >= currentTopicsStartedAtOrAfter)) where

我已经在“仅代码”模式下使用了实体框架CTP5。我正在对从数据库返回的对象运行LINQ查询,因为查询运行得非常慢。是否有任何方法可以获取从查询生成的SQL语句

Topic currentTopic =
    (from x in Repository.Topics
     let isCurrent = (x.StoppedAt <= x.StartedAt || (x.StartedAt >= currentTopicsStartedAtOrAfter))
     where x.Meeting.Manager.User.Id == user.Id && isCurrent
     orderby x.StartedAt descending
     select x).FirstOrDefault();
主题当前主题=
(来自Repository.Topics中的x)
设isCurrent=(x.StoppedAt=currentTopicsStartedAtOrAfter))
其中x.Meeting.Manager.User.Id==User.Id&&isCurrent
orderby x.从降序开始
选择x).FirstOrDefault();
“Repository”属性是DbContext的后代

这有点复杂,因为EF不能在对象上使用我的helper方法,所以我直接在查询中指定逻辑


那么,是否有任何方法可以转储LINQ查询将生成的SQL(例如,到我的log4net存储库)?

我要么使用SQL跟踪直接获取服务器上运行的查询,要么使用Windows的事件跟踪(SQL分析)功能。

扩展方法ToTraceString()可能就是您正在寻找的:

您可以尝试使用as(但这是CTP3的旧帖子)

你的其他选择是:

  • -MS SQL Developer工具的一部分(如果数据库是SQL Server)
  • Intelli trace-仅适用于VS 2010 Ultimate,但不显示参数值
在通用EF中,您也可以按照@Andy的建议使用
ToTraceString
,但是CodeFirst中的
DbQuery
没有这个方法(或者我没有找到它)

编辑:


因此
DbQuery
没有
ToTraceString
,因为它是作为
ToString
的,这对我来说很有效,而且是免费的:

public static class DebugExtensions
{
    private static object GetPropertyValue(object o, string Name)
    {
        return o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Where(x => x.Name == Name).First().GetValue(o, null);
    }
    public static string ToTraceString(this IQueryable query)
    {
        var oquery = (ObjectQuery)GetPropertyValue(GetPropertyValue(query, "InternalQuery"), "ObjectQuery");
        return oquery.ToTraceString();
    }
}
用法:

   var rows = db.Forecasts.Take(1);
   System.Diagnostics.Debug.WriteLine(rows.ToTraceString());

设置日志记录非常简单,如下所示:

context.Database.Log = Console.WriteLine;

原始答案:

我无法帮助您处理SQL转储,但我很好奇为什么EF不能在对象上使用您的helper方法。你是如何定义帮助程序的?我在这个主题上有一个IsCurrent属性,它被定义为“return(StoppedAt+1 for.ToString())-我花了15分钟找到这篇文章,花了2秒钟才真正看到我的查询!我喜欢它当我使用DbQuery.ToString()时,它返回的SQL不填充参数。换句话说,它包含一堆”@p__linq__0“.我是唯一一个看到这一点的人吗?这不会起作用,因为他使用的是DbContext,它使用DbSet和DbQuery,而不是ObjectContext,它使用ObjectQuery。