检索 LINQ to sql 语句 (IQueryable) WITH 参数

本文关键字:IQueryable WITH 参数 语句 LINQ to sql 检索 | 更新日期: 2023-09-27 17:59:01

我试图弄清楚是否有办法检索在数据库服务器上执行的(完整(sql 语句。
我已经发现了一些东西,但它并不完全是我想要的:

IQueryable<SomeType> someQuery = ...
string command = dataContext.GetCommand(query).CommandText;

就我而言,这给了我一个命令字符串,如下所示:

SELECT TOP (50) [t0].[ID], ....
FROM [dbo].[someTable] AS [t0]
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0))

在数据库上执行:

exec sp_executesql N'SELECT TOP (50) [t0].[ID], ...
FROM [dbo].[someTable] AS [t0]
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0, @p1))',N'@p0  int,@p1 int',@p0=401,@p1=201

有没有办法从 C# 代码中检索这个"完整"语句(以及参数值(?

检索 LINQ to sql 语句 (IQueryable) WITH 参数

如果您有 IQueryable<T>并调用 .ToString() 方法。
例如:

var db = new DbContext();
IQueryable<Blog> query = db.Blog.Where(tt=> tt.Id > 100).OrderByDescending(tt=>tt.Id);
var sqlString = query.ToString();
Console.WriteLine(sqlString);

这将生成以下输出:

SELECT [Extent1].[Id] AS [Id], 
[Extent1].[Title] AS [Title], 
[Extent1].[Author] AS [Author], 
[Extent1].[Text] AS [Text], 
[Extent1].[CreatedAt] AS [CreatedAt], 
[Extent1].[UpdatedAt] AS [UpdatedAt]
FROM [dbo].[Blogs] AS [Extent1]
WHERE [Extent1].[Id] > 100
ORDER BY [Extent1].[Id] DESC

获得命令后,您可以打印命令文本,然后循环访问参数集合并打印所有单个参数。

还有linq-to-sql调试可视化工具,它在调试模式下执行相同的操作。

一个非常好的工具来查看正在发生的查询是Linq-to-sql探查器。

在最新版本的 EF Core 5 ToQueryString 中,

query.ToQueryString()
(SqlCommand)dataContext.GetCommand(query)

将允许您访问参数集合。

我正在使用Datacontext.Log属性来获取生成的SQL语句(它包括语句文本和参数(。

只需设置YourDataContext.Log = SomeTextWriter.

它可以写入文件(Log = new StreamWriter(@"c:'temp'linq.log")(或调试窗口,请参阅此帖子

在"局部变量"窗格中查看IQueryable时,可以访问 DebugView> 查询,其中将包含 SQL 语句。