【问题标题】:How can I Check how many queries a LinqToSql DataContext ran?如何检查 LinqToSql DataContext 运行了多少查询?
【发布时间】:2015-02-25 08:30:19
【问题描述】:

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

【问题讨论】:

  • 查看工具,例如:Miniprofiler miniprofiler.com
  • @jessehouwing - 感谢您的提示。如果内部无法做到这一点,我会检查外部包。我希望框架以一种或另一种方式向我提供这些信息。
  • 查看 miniprofiler 的代码,看看他们是如何做到的 :) github.com/MiniProfiler/dotnet/tree/master/…
  • @jessehouwing - 很好..我会检查一下..谢谢!顺便说一句,我坚持使用 Linq2Sql ..

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


【解决方案1】:

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

ctx.Log = Console.Out;

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

如果您想提供一个汇总视图,例如您可以登录到 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 来进行计数。每个语句都以在我的测试中具有以下格式的行结尾:

-- 上下文:SqlProvider(Sql2008) 模型:AttributedMetaModel 构建:4.0.30319.34209

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

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

【讨论】:

  • 感谢您的回答。我知道我实际上可以看到查询。我的问题是,如果我加载“1 到多个”子表,则可以执行很多子查询。他们也会被记录吗?或者我会看到与使用 ctx.ToString() 看到的相同的“主查询”吗?
  • @AmirPopovich:DataContext 执行的所有活动都使用Log 属性的当前值记录,因此如果您在执行主查询之前设置此属性并在执行完所有操作后检查输出查询已完成,您将看到对服务器执行的所有操作。
  • +1 哇,太棒了。我稍后会在我的代码中检查这一点。可惜他们也没有提供柜台。
  • @AmirPopovich:我已经更新了我的答案,以演示如何计算执行的 SQL 语句的数量,这可能正是你要找的。​​span>
  • 我已经测试了你的代码,它运行良好,非常感谢。我对 .net 没有添加内置和轻量级的东西感到沮丧,因为在每个上下文中计算这个都非常繁重。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多