使用参数检索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