【发布时间】:2013-01-15 00:07:25
【问题描述】:
从 linq 生成(并成功执行)的每个 sql 语句中,我需要知道以下信息:
- 真正的带参数值的sql语句
- 开始执行日期
- 执行结束日期
- 返回的记录数(如果是选择)
有人知道如何获取这些信息吗?
【问题讨论】:
标签: linq linq-to-sql
从 linq 生成(并成功执行)的每个 sql 语句中,我需要知道以下信息:
有人知道如何获取这些信息吗?
【问题讨论】:
标签: linq linq-to-sql
您可以从数据上下文的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 中,有几种方法可以获得查询的执行时间:
使用带有@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
如果您有多个更新,您可以尝试将它们作为输出返回 来自存储过程的参数
【讨论】: