C# 使用参数检索LINQ to sql语句(IQueryable)

C# 使用参数检索LINQ to sql语句(IQueryable),c#,linq-to-sql,C#,Linq To Sql,我试图找出是否有办法检索在数据库服务器上执行的(完整)sql语句。 我已经找到了一些东西,但并不完全是我想要的: IQueryable<SomeType> someQuery = ... string command = dataContext.GetCommand(query).CommandText; 在数据库上执行以下操作: exec sp_executesql N'SELECT TOP (50) [t0].[ID], ... FROM [dbo].[someTable] A

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

IQueryable<SomeType> someQuery = ...
string command = dataContext.GetCommand(query).CommandText;
在数据库上执行以下操作:

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代码中检索这个“full”语句(以及参数值)


将允许您访问参数集合。

获得命令后,您可以打印CommandText,然后循环参数集合并打印所有单个参数

还有在调试模式下执行相同操作的


在查询发生时查看查询的一个非常好的工具是

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

只需设置YourDataContext.Log=SomeTextWriter


它可以写入文件(
Log=newstreamwriter(@“c:\temp\linq.Log”)
)或调试窗口,

如果您有
IQueryable
并调用
.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);

在EF Core 5的最新版本中


问题询问完整的SQL语句。@John在向SqlServer发送参数化查询时,没有完整的SQL语句,首先发送带有参数占位符的CommandText,然后发送参数及其类型和值。同意,但您的回答没有提供这种有用的上下文。如果你提供一个更全面的答案,它的质量会更高,观众可以很快地将其与问题联系起来,我将删除否决票。他要求提供完整的语句,就像你需要传递给bcl命令行实用程序以导出语句的数据一样。我需要全文,包括'exec'命令以及字符串化的参数值(一个非常重要的映射任务)。基本上是一个可以直接粘贴到SSMS中并运行的字符串。请参阅此处的类似问题(re:generated SQL),它可能提供一些细节。是的,由该DataContext生成的所有语句(包括selects、INSERT、updates)。问题是如何检索完整语句,但您的解决方案不包括参数。如果您使用任何变量,它将打印出变量(我在示例中不使用任何变量)。但它不会打印变量的值。(但这很简单)不适用于IQueryable@phil123456您正在使用哪个版本的EntityFramework?
(SqlCommand)dataContext.GetCommand(query)
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
query.ToQueryString()