【问题标题】:Record information from the SQL generated by Linq-to-sql从 Linq-to-sql 生成的 SQL 记录信息
【发布时间】:2013-01-15 00:07:25
【问题描述】:

从 linq 生成(并成功执行)的每个 sql 语句中,我需要知道以下信息:

  • 真正的带参数值的sql语句
  • 开始执行日期
  • 执行结束日期
  • 返回的记录数(如果是选择)

有人知道如何获取这些信息吗?

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

    您可以从数据上下文的Log 属性中获取生成的 SQL 查询: 例如:

    db.Log = Console.Out;
    IQueryable<Customer> custQuery =
        from cust in db.Customers
        where cust.City == "London"
        select cust;
    
    foreach(Customer custObj in custQuery)
    {
        Console.WriteLine(custObj.CustomerID);
    }
    

    对于执行的开始和结束,我认为您不能专门使用 linq 来做到这一点。您可以使用 Stopwatch 类来测量时间,但这也会计算 .NET 运行时从 linq to sql 语句提供的 IQueryable 接口的表达式树生成 SQL 所需的时间。

    在普通 SQL 中,有几种方法可以获得查询的执行时间:

    • 使用 SQL 服务器分析器
    • 使用带有@StartTime@EndTime 参数的SQL 脚本

      DECLARE @StartTime datetime,@EndTime datetime    
      SELECT @StartTime=GETDATE()    
      -- your query    
      SELECT @EndTime=GETDATE()    
      SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [Duration in microseconds]
      
    • 使用带有 SET STATISTICS TIME (Transact-SQL) 的 SQL 脚本

      SET STATISTICS TIME ON
      GO  
      -- your query  
      SET STATISTICS TIME OFF  
      GO
      

    至于受影响的行数,您也可以尝试几种方法。你可以:

    • 试试 DataContext.GetChangeSet,这应该返回更新计数 与:

      dataContext.GetChangeSet().Updates.Count
      
    • 尝试返回@@ROWCOUNT

    • 如果您有多个更新,您可以尝试将它们作为输出返回 来自存储过程的参数

    【讨论】:

    • ...或使用专门为与 Linq-to-SQL 一起使用而构建的分析器:huagati.com/L2Sprofiler
    • @KristoferA-Huagati.com 看起来是一个非常不错的工具。我自己肯定会试一试;)答案是因为我以某种方式理解他想要以编程方式检索所有这些值。
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多