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

How can I Check how many queries a LinqToSql DataContext ran?

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

在 LINQ to SQL 中,您可以选择将生成的 SQL 记录到 TextWriter。例如,您可以登录到控制台:

ctx.Log = Console.Out;

这不会为您提供查询计数,但会为您提供实际执行的 SQL,这可能会让您更好地了解正在发生的事情。

如果您想提供 select 条语句的聚合视图,您可以记录到 StringWriter,然后使用正则表达式计算单词 [= 的出现次数15=]:

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.

的子句

您可以计算执行的 SQL 语句的数量,而不是尝试 "understand" 和 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;