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

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

有什么方法可以检查 DataContext 运行了多少数据库查询?

我知道我可以运行 sql 分析器,但我想分析一个包含数百个查询的大项目。

如果没有,是否有任何有用的事件我可以注册并计算它们?

我正在寻找这样的东西:

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,这可能会让您更好地了解正在发生的事情。

如果您想提供一个聚合 View ,例如您可以记录到 StringWriter 的 select 语句的数量,然后使用正则表达式来计算单词 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,如果您有说一个包含单词 SELECTWHERE 子句。

您可以计算执行的 SQL 语句的数量,而不是试图“理解”SQL 来进行计数。每条语句以一行结尾,在我的测试中具有以下格式:

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

You can create a regular expression to match this string:

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

关于c# - 如何检查 LinqToSql DataContext 运行了多少查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28714387/

相关文章:

c# - 静态方法与实例方法,多线程,性能

c# - ToDictionary 从第二个表查询返回 Null

c# - 没有结果时的 LINQ to SQL 连接

c# - 无法将类型 System.Collections.Generic.List<Derived DataClass> 隐式转换为 System.Collections.Generic.List<BaseD dataClass>

c# - 在 C# 中将类型 'uint' 转换为 'int'

c# - Windows 服务中的 Kerberos 身份验证

c# - 用于 URL 验证的正则表达式

.net - "Compatibility Pack"用于向后移植新的 .NET Framework 功能?

c# - 在 C# 中避免 NullReferenceException 的优雅方法

Linq 自定义比较器包含?