使用参数检索LINQ to sql语句(IQueryable)
我试图弄清楚是否有办法检索在数据库服务器上执行的(完整)sql语句。
我已经发现了一些东西,但它并不完全符合我的要求:
IQueryable 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#代码中检索这个“完整”语句(以及参数值)?
获得Command后,您可以打印CommandText,然后遍历Parameters集合并打印所有单个参数。
还有linq-to-sql调试可视化工具 ,它在调试模式下也是如此。
一个非常好的工具来查看正在发生的查询是Linq-to-sql探查器
(SqlCommand)dataContext.GetCommand(query)
将为您提供对Parameters集合的访问权限。
您还可以使用DataContext的Log属性来记录生成的SQL (它包括命令文本和参数 )。
只需设置YourDataContext.Log = SomeTextWriter
。 它可以写入文件( Log = new StreamWriter(@"c:\temp\linq.log")
)或调试窗口, 请参阅此post
如果您有一个IQueryable
实例并调用.ToString()
方法,您还可以看到生成的sql查询。
例如:
var db = new DbContext(); IQueryable 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