我试图弄清楚是否有办法检索在数据库服务器上执行的(完整)sql语句.
我已经发现了一些东西,但它并不是我想要的东西:
IQueryable<SomeType> someQuery = ...
string command = dataContext.GetCommand(query).CommandText;
Run Code Online (Sandbox Code Playgroud)
在我的情况下,这给了我一个命令字符串,如:
SELECT TOP (50) [t0].[ID], ....
FROM [dbo].[someTable] AS [t0]
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0))
Run Code Online (Sandbox Code Playgroud)
在数据库上执行:
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
Run Code Online (Sandbox Code Playgroud)
有没有办法从C#代码中检索这个"完整"语句(以及参数值)?
bat*_*aci 20
在最新版本的 EF Core 5 ToQueryString中,
query.ToQueryString()
Run Code Online (Sandbox Code Playgroud)
Nic*_*los 13
如果您有实例IQueryable<T>并且调用该.ToString()方法,您还可以查看生成的sql查询
.
例如:
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);
Run Code Online (Sandbox Code Playgroud)
这将生成以下输出:
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
Run Code Online (Sandbox Code Playgroud)
mar*_*rto 11
获得Command后,您可以打印CommandText,然后遍历Parameters集合并打印所有单个参数.
还有linq-to-sql调试可视化工具,它在调试模式下也是如此.
一个非常好的工具来查看正在发生的查询是Linq-to-sql探查器
(SqlCommand)dataContext.GetCommand(query)
Run Code Online (Sandbox Code Playgroud)
将为您提供对Parameters集合的访问权限.
| 归档时间: |
|
| 查看次数: |
34385 次 |
| 最近记录: |