如何检查LinqToSql DataContext运行了多少查询?

时间:2015-02-25 08:30:20

标签: c# .net linq-to-sql datacontext

有什么方法可以查看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.
}

1 个答案:

答案 0 :(得分:3)

在LINQ to 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;    

显然,您可能还需要计算其他字词,例如INSERTUPDATEDELETE,如果您说WHERE条款包含SELECT,则可能会遇到问题。单词var regex = new Regex(@"^-- Context: ", RegexOptions.Multiline); var statementCount = regex.Matches(stringWriter.ToString()).Count;

您可以计算执行的SQL语句数,而不是尝试“理解”SQL来进行计数。每个语句以我的测试中具有以下格式的行结束:

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

您可以创建一个正则表达式来匹配此字符串:

{{1}}