Как отследить запросы на Linq-to-sql DataContext - PullRequest
7 голосов
/ 27 августа 2008

В подкасте с кодом 14 кто-то упоминает, что в стеке потока отображаются запросы, выполненные во время запроса, внизу страницы.

Звучит как отличная идея для меня. Каждый раз, когда загружается страница, я хочу знать, какие SQL-операторы выполняются, а также подсчитывать общее количество обращений к БД. У кого-нибудь есть аккуратное решение этой проблемы?

Что вы считаете приемлемым количеством запросов? Я думал, что во время разработки мое приложение может выдать исключение, если для отображения страницы требуется более 30 запросов.

РЕДАКТИРОВАТЬ: Я думаю, что я не должен был четко объяснить мой вопрос. Во время HTTP-запроса веб-приложение может выполнить дюжину или более SQL-операторов. Я хочу, чтобы эти заявления были добавлены внизу страницы вместе с подсчетом количества утверждений.

ЗДЕСЬ МОЕ РЕШЕНИЕ:

Я создал класс TextWriter, в который DataContext может записывать:

public class Logger : StreamWriter
    {
        public string Buffer { get; private set; }
        public int QueryCounter { get; private set; }

        public Logger() : base(new MemoryStream())
        {}

        public override void Write(string value)
        {
            Buffer += value + "<br/><br/>";
            if (!value.StartsWith("--")) QueryCounter++;
        }

        public override void WriteLine(string value)
        {
            Buffer += value + "<br/><br/>";
            if (!value.StartsWith("--")) QueryCounter++;
        }
    }

В конструкторе DataContext я настраиваю регистратор:

public HeraldDBDataContext()
        : base(ConfigurationManager.ConnectionStrings["Herald"].ConnectionString, mappingSource)
    {
        Log = new Logger();
    }

Наконец, я использую событие Application_OnEndRequest, чтобы добавить результаты в конец страницы:

protected void Application_OnEndRequest(Object sender, EventArgs e)
    {
        Logger logger = DataContextFactory.Context.Log as Logger;
        Response.Write("Query count : " + logger.QueryCounter);
        Response.Write("<br/><br/>");
        Response.Write(logger.Buffer);
    }

Ответы [ 4 ]

3 голосов
/ 27 августа 2008
System.IO.StreamWriter httpResponseStreamWriter = 
new StreamWriter(HttpContext.Current.Response.OutputStream);

dataContext.Log = httpResponseStreamWriter;

Вставьте это на своей странице, и вы получите SQL-запрос на странице. Очевидно, я бы обернул это в небольшой метод, который вы можете включить / отключить.

3 голосов
/ 27 августа 2008

Если вы поместите .ToString () в переменную запроса var, вы получите sql. Вы можете использовать это в Debug en VS2008. Визуализатор отладки

например:

var query = from p in db.Table
            select p;

MessageBox.SHow(query.ToString());
1 голос
/ 16 сентября 2008

У меня есть запись в моем блоге, которая охватывает отправку в файлы журнала, память, окно отладки или несколько писателей .

0 голосов
/ 27 августа 2008

Из Linq в действии

Microsoft имеет инструмент визуализации запросов, который можно загрузить отдельно от VS 2008. Он находится по адресу http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...