如何允许MiniProfiler查看EF DbContext.Database.SqlQuery查询

时间:2015-12-17 05:26:14

标签: c# entity-framework mvc-mini-profiler

我正在调整一些花费太长时间的实体框架查询,在某些情况下,我正在通过dbContext.Database.SqlQuery<Entity>(sql, [parameters])执行原始SQL。

但是,这些查询不再显示在profiler.Step文本旁边的MiniProfiler中。我需要做些什么才能让它们再次出现?

我做了一些搜索,但发现很少。由于我通过EF进行查询,我认为它会起作用。我很确定我已经看到Dapper查询出现在MiniProfiler中,因此很明显随机查询可以移交给MiniProfiler,我只是不知道我做错了什么。

请参见下图中的红色椭圆:它应显示我可以点击查看SQL的时间。另外,现在正下面的SQL时间省略了我转换的查询。

MiniProfiler with missing SQL info

我做的唯一一种改变是转换这样的查询:

return db.Blornk.Where(b => b.HasPlutonium = @flag);

这样的人:

return db.Database.SqlQuery<Blornk>(@"
   SELECT *
   FROM Blornk
   WHERE HasPlutonium = @flag",
   new SqlParameter("@flag", flag)
);

当然,EF被推迟了,这就是我首先做出改变的原因,但如果它是相同的查询则不重要,我只需要知道如何获得MiniProfiler再次开心。

1 个答案:

答案 0 :(得分:1)

根据the MiniProfiler authors,由于MiniProfiler挂钩到EF6的方式,它无法完成。显示了一种解决方法,但它需要通过配置文件连接手动发送我们的查询。

  

有一种解决方法。下面的代码使用Dapper和datacontext连接来创建ProfiledDbConnection,它接受相同的sql,返回相同的结果并记录sql。

using (MiniProfiler.Current.Step("Get Count using ProfiledConnection - sql recorded"))
{
    using (var conn = new ProfiledDbConnection(context.Database.Connection, MiniProfiler.Current))
    {
        conn.Open();
        newCount = conn.Query<int>(sql).Single();
        conn.Close();
    }
}