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

Twe*_*eZz 35 c# linq-to-sql

我试图弄清楚是否有办法检索在数据库服务器上执行的(完整)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)

  • @Skary 他们不是完全不同的技术。EF 是 Linq to Sql 的继承者。Linq to sql 今天几乎已经死了。许多人在 SO 中搜索 EF 或 EF Core 的答案。https://www.infoq.com/news/2008/11/DLINQ-Future/ (3认同)

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)

  • 问题是如何检索完整的语句,但是您的解决方案不包含参数。 (2认同)
  • 如果您使用任何变量,它将打印出变量(我的例子中不使用任何变量).但它不会打印变量的值.(但这很简单) (2认同)
  • 不适用于 IQueryable (2认同)

mar*_*rto 11

获得Command后,您可以打印CommandText,然后遍历Parameters集合并打印所有单个参数.

还有linq-to-sql调试可视化工具,它在调试模式下也是如此.

一个非常好的工具来查看正在发生的查询是Linq-to-sql探查器


cde*_*del 9

(SqlCommand)dataContext.GetCommand(query)
Run Code Online (Sandbox Code Playgroud)

将为您提供对Parameters集合的访问权限.

  • 问题要求完整的SQL语句. (5认同)
  • 同意,但你的答案并没有提供这种有用的背景.如果你提供更全面的答案,它将是更高的质量,观众将能够迅速将其与问题联系起来,我将删除downvote. (4认同)
  • @John 当向 SqlServer 发送参数化查询时,没有完整的 SQL 语句之类的东西,首先发送带有参数占位符的 CommandText,然后是带有它们的类型和值的参数。 (2认同)

jar*_*ics 5

您还可以使用DataContext的Log属性来记录生成的SQL (它包括命令文本和参数).

刚设置YourDataContext.Log = SomeTextWriter.它可以写入文件(Log = new StreamWriter(@"c:\temp\linq.log"))或调试窗口,请参阅此文章

  • 是的,由DataContext生成的所有语句(包括选择,插入,更新). (2认同)