我正在调整一些花费太长时间的实体框架查询,在某些情况下,我正在通过dbContext.Database.SqlQuery<Entity>(sql, [parameters])
执行原始SQL。
但是,这些查询不再显示在profiler.Step
文本旁边的MiniProfiler中。我需要做些什么才能让它们再次出现?
我做了一些搜索,但发现很少。由于我通过EF进行查询,我认为它会起作用。我很确定我已经看到Dapper查询出现在MiniProfiler中,因此很明显随机查询可以移交给MiniProfiler,我只是不知道我做错了什么。
请参见下图中的红色椭圆:它应显示我可以点击查看SQL的时间。另外,现在正下面的SQL时间省略了我转换的查询。
我做的唯一一种改变是转换这样的查询:
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再次开心。
答案 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(); } }