【问题标题】:Retrieve LINQ to sql statement (IQueryable) WITH parameters检索 LINQ to sql 语句 (IQueryable) WITH 参数
【发布时间】:2021-09-14 07:38:00
【问题描述】:

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

IQueryable<SomeType> 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# 代码中检索这个“完整”语句(还有参数值)?

【问题讨论】:

标签: c# linq-to-sql


【解决方案1】:

如果你有一个实例,你也可以看到生成的 sql 查询 IQueryable&lt;T&gt; 并调用 .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);

这将生成以下输出:

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

【讨论】:

  • 问题是如何检索完整的语句,但您的解决方案不包含参数。
  • 如果您使用任何变量,它将打印出变量(我在我的示例中不使用任何变量)。它不会打印变量的值。 (但这很简单)
  • @phil123456 你使用的是哪个版本的EntityFramework?
  • @NickPolyderopoulos 如问题中所述,他不使用 EF 他使用 LinqToSql,一种不同的技术,您的答案是 OT 恕我直言
【解决方案2】:

获得命令后,您可以打印 CommandText,然后遍历参数集合并打印所有单独的参数。

还有linq-to-sql debug visualizer,它在调试模式下也是如此。

Linq-to-sql profiler

【讨论】:

    【解决方案3】:
    (SqlCommand)dataContext.GetCommand(query)
    

    将允许您访问参数集合。

    【讨论】:

    • 问题要求完整的 SQL 语句。
    • @John 当向 SqlServer 发送参数化查询时,没有完整的 SQL 语句,首先发送带有参数占位符的 CommandText,然后发送带有类型和值的参数。
    • 同意,但您的回答没有提供这种有用的上下文。如果您提供更全面的答案,它的质量会更高,观众将能够快速将其与问题联系起来,我将删除反对票。
    • 他要求提供完整的语句,就像您需要传递给 bcl 命令行实用程序以导出语句数据的语句一样。我需要完整的文本,包括“exec”命令以及字符串化的参数值(一个重要的映射任务)。基本上是一个可以直接粘贴到 SSMS 中并运行的字符串。
    【解决方案4】:

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

    只需设置YourDataContext.Log = SomeTextWriter

    可以写入文件 (Log = new StreamWriter(@"c:\temp\linq.log")) 或调试窗口,see this post

    【讨论】:

    • 是的,该 DataContext 生成的所有语句(包括选择、插入、更新)。
    【解决方案5】:

    在最新版本的 EF Core 5 ToQueryString

    query.ToQueryString()
    

    【讨论】:

    • 这个问题清楚地说明了 LinqToSql 我不明白你为什么在这里回答关于 EF Core 5,一种完全不同的技术
    • @Skary 他们不是完全不同的技术。 EF 是 Linq to Sql 的继承者。 Linq to sql 今天几乎死了。许多人在 SO 中搜索 EF 或 EF Core 的答案。 infoq.com/news/2008/11/DLINQ-Future
    • 它们都是 ORM,但具有非常不同的架构恕我直言,如果不是,请给我一个参考,其中 microsoft state 否则。就我个人而言,我不介意它是否是一种陈旧的死技术,这里的主题是 LinqToSql(这是一个 2011 年的问题)而不是 EF Core 或其他 ORM 技术,如 NHibernate 或 LLBL
    【解决方案6】:

    在 Locals 窗格中查看 IQueryable 时,您可以访问 DebugView > Query,其中将包含 SQL 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多