2015-02-25 4 views
1

Есть ли способ проверить, сколько запросов БД DataContext?Как проверить, сколько запросов выполнялось LinqToSql DataContext?

Я знаю, что могу запустить sql profiler, но хочу проанализировать большой проект с сотнями запросов.

Если нет, есть ли какое-либо полезное событие, которое я могу зарегистрировать и сосчитать?

Я ищу что-то вроде этого:

using(DataContext ctx = new DataContext(connectionString)) 
{ 
    // Add load options 
    // execute a query 

    // I want information about the number of actual sql queries that ran using this context. 
    // Adding "1 to many" loadoptions or complex queries can create multiple sub-queries and that's why I want this info. 
} 
+0

Отъезд инструменты, такие как: Miniprofiler HTTP: // miniprofiler .com/ – jessehouwing

+0

@jessehouwing - Спасибо за подсказку. Я проверю внешний пакет, если в доме нет возможности сделать это. Я бы ожидал, что структура предоставит мне эту информацию так или иначе. –

+0

посмотрите на код miniprofiler, чтобы посмотреть, как они это делают. Https://github.com/MiniProfiler/dotnet/tree/master/StackExchange.Profiling.EntityFramework6 – jessehouwing

ответ

3

В LINQ к SQL вы имеете возможность войти сгенерированный SQL в TextWriter. Например, вы можете войти в консоль:

ctx.Log = Console.Out; 

Это не даст вам количество запросов, но она предоставит вам с фактической SQL выполненной, который, вероятно, дает вам лучше понять, что происходит.

Если вы хотите, чтобы обеспечить агрегированный вид говорит, что количество выбранных заявлений вы можете войти в StringWriter, а затем использовать регулярные выражения для подсчета количества вхождений слова SELECT:

var stringWriter = new StringWriter(); 
ctx.Log = stringWriter; 

// Use DataContext referenced by ctx ... 

var regex = new Regex(@"\bSELECT\b"); 
var selectCount = regex.Matches(stringWriter.ToString()).Count;  

Очевидно, вам могут также засчитываться другие слова, такие как INSERT, UPDATE и DELETE, и вы можете столкнуться с проблемами с подсчетом, если вы сказали предложение WHERE, содержащее слово SELECT.

Вместо того, чтобы пытаться «понять» SQL, чтобы сделать счет, вы можете подсчитать количество выполненных SQL-операторов. Каждый оператор заканчивается линией, которая в моих тестах имеют следующий формат:

 
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.34209 

Вы можете создать регулярное выражение, чтобы соответствовать этой строки:

var regex = new Regex(@"^-- Context: ", RegexOptions.Multiline); 
var statementCount = regex.Matches(stringWriter.ToString()).Count;  
+0

Спасибо за ответ. Я знаю, что я действительно вижу запросы. Моя проблема в том, что если я загружу подтаблицы «1 ко многим», можно выполнить множество подзапросов. Будут ли они также регистрироваться? Или я увижу тот же «основной запрос», что и я, используя ctx.ToString()? –

+0

@AmirPopovich: все действия, выполняемые «DataContext», регистрируются с использованием текущего значения свойства «Журнал», поэтому если вы установите это свойство перед выполнением основного запроса и проверите вывод после того, как все ваши запросы будут выполнены, вы увидите все выполненных против сервера. –

+0

+1 Вау, это мило. Я проверю это позже в своем коде. К сожалению, они не предоставили счетчик. –

Смежные вопросы