2015-12-17 2 views
2

Я настраиваю некоторые запросы Entity Framework, которые занимают слишком много времени, и в некоторых случаях я прибегаю к выполнению необработанного SQL через dbContext.Database.SqlQuery<Entity>(sql, [parameters]).Как разрешить MiniProfiler видеть запросы EF DbContext.Database.SqlQuery

Однако эти запросы больше не отображаются в MiniProfiler рядом с текстом profiler.Step. Что мне нужно сделать, чтобы они снова появились?

Я сделал несколько поисков и нашел мало. Поскольку я делаю запрос через 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) 
); 

Конечно, ФВ задерживаются поэтому я сделал изменения в первую очередь, но это даже не имеет значения, если это тот же запрос, мне просто нужно знать, как снова получить MiniProfiler.

ответ

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(); 
    } 
} 
Смежные вопросы