检索 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# 代码中检索这个"完整"语句(以及参数值(?
如果您有 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 语句。