5

我有以下示例代码:

  Context context = new Context();
  Repository repository = new Repository(context);

  Post post = repository.First<Post>(x => x.Id == 1);

  Model model = new Model {
    Created = cube.Created,
    Id = cube.Id,
    Name = cube.Name,
    Pack = cube.Pack.Id,
    Mimes = context.Files.Where(x => x.Id == 1).Select(x => x.Mime).ToList()
  };

我需要找出哪些 SQL 查询被发送到数据库。

如何使用 SQL Express 和 VS 2012 分析 EF 查询?

有什么工具可以做到这一点吗?

4

2 回答 2

19

另一个答案中指定的EF Profiler是一头野兽——非常强大,但这并不是免费的($$、磁盘空间和时间)。它也是由NHibernate 和RavenDB的Oren Eini制作的。

我喜欢在紧要关头使用的工具更轻量级,当然在功能方面无法与 EF Prof 相比 - 但成本($$、时间和磁盘)是或接近, 零。

我在 LocalDb 上使用 EF 测试了这些轻量级分析器,但它们的主要用例是更传统的 Sql Server 风格(包括 Express)。

ExpressProfiler

到目前为止,最容易使用的(也是最简单的-show-me-the-SQL-statements-kthxbye)是CodePlex 上的 ExpressProfiler

在此处输入图像描述

整个程序是一个 126 KB 的 EXE!现在轻了!

AnjLab Sql Profiler

另一种是来自DataWizard的,它曾经是免费的(显然现在价格从 5 美元起)。

当它是开源的时候,有人设法在 GitHub 上保存了一个快照(包括 xcopy-installable 二进制文件)。

可执行文件将自己显示为“AnjLab Sql Profiler”,并允许对显示的事件进行一些过滤 - 但这种优势也是它的弱点,因为可以启用/禁用的事件类型太多了。如果选择了所有内容,则输出非常冗长。

仅选择特定事件即可获得更合理的输出。

在此处输入图像描述

以下是我为获得上述输出而选择的事件:

在此处输入图像描述

于 2014-01-17T16:46:47.183 回答
4

您在这里有几个选择。

  1. 通过在运行时使用https://stackoverflow.com/a/7901917/1070291((ObjectQuery)query).ToTraceString()打印查询来检查查询(我认为这仅适用于查询,因此在上述情况下可能不是最好的)
  2. 使用管理工作室内置的 SQL Profiler
  3. 使用Entity Framework Profiler(一个非常好的第三方工具,有试用版,这是我用来分析查询的)
于 2012-12-11T08:33:39.193 回答