记录Linq-to-sql生成的SQL的信息

时间:2012-01-05 11:29:32

标签: linq linq-to-sql

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

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

任何人都知道如何获取此信息?

1 个答案:

答案 0 :(得分:2)

您可以从数据上下文的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到sql语句所呈现的IQueryable接口从表达式树生成SQL所需的时间。

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

  • 使用SQL server profiler
  • 使用带有@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

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