找出运行Entity Framework sql代码的代码

时间:2017-01-01 10:27:35

标签: asp.net-mvc entity-framework profiler ants

我已经开始使用一些Entity Framework分析器,例如ANTS和一些其他类似的替代品。在分析器分析之后,它列出了Entity Framework生成的SQL查询格式中的所有Entity Framework瓶颈。但是我无法跟踪代码中的查询。是否可以知道哪一行代码运行该SQL查询?

1 个答案:

答案 0 :(得分:2)

我认为你不能让ANTS这样做(只有Redgate可以)。

但是,在进行性能分析时,或者不进行分析时,您始终可以通过将记录Action附加到上下文的Database.Log属性来记录所有SQL语句。

在此日志记录操作中,您还可以记录此时的堆栈跟踪,然后尝试在调试日志记录中查找报告的SQL瓶颈:

using (var db = new MyContext())
{
    db.Database.Log = s =>
    {
        Debug.WriteLine(s);
        if (s.StartsWith("SELECT"))
            Debug.WriteLine("\nStack trace:\n" +
                string.Join("", new StackTrace(3).GetFrames().ToList()));
    };
    // LINQ statements here.
}

一些评论

  • 我使用new StackTrace(3)跳过覆盖日志记录过程本身的前几帧。在堆栈跟踪的某处,您将找到触发记录的SQL语句的C#方法。
  • 这仅记录SELECT命令的堆栈跟踪。通常,那些是你想要分析的。

从上下文工厂获取上下文实例是个好主意,因此您只能编写一次此日志记录代码。您可能希望通过if DEBUG编译器指令有条件地添加日志记录操作。