【问题标题】:Get SQL query from LINQ to SQL?从 LINQ 到 SQL 获取 SQL 查询?
【发布时间】:2013-08-14 16:31:51
【问题描述】:

我有一个查询,我将byte[] 作为参数传递。我正在尝试从中获取 SQL 查询并在管理工作室中运行该查询以进行调试。如何从中提取 SQL 语句?

 committeeMember =
           db.Committee_Member.FirstOrDefault(x => x.Customer_Number == activity.Contact.Number
           && x.Position_Start_Date.Value.Year == activity.EndDate
           && x.Committee_Id == activity.Committee.Id && x.Cancelled != 1);

【问题讨论】:

标签: c# .net linq-to-sql


【解决方案1】:

在调试器中,将鼠标悬停在 commiteeMember 变量上 - 它将显示生成的 SQL 查询:

这是ToString() 为查询返回的内容。您可以通过调用 ToString 手动获取相同的生成 SQL 查询:

string sql = committeeMember.ToString();

这个被覆盖的方法在内部调用ObjectQuery.ToTraceString(),它返回将在数据源上运行的命令。


您还可以使用 SQL Profiler 或 Entity Framework Profiler 查看执行了哪个 SQL 查询。

【讨论】:

  • 出于好奇,有没有办法以编程方式做到这一点?
  • SQL Profiler 或 Entity Framework Profiler 需要在 SQL Server 机器还是我的本地机器上运行?
  • @James123 你可以在本地机器上同时运行
  • 以前从未听说过实体框架分析器。有链接吗?
  • 对于那些使用 Entity Framework 6 的人请查看this,希望对某人有所帮助。
【解决方案2】:

顺便说一句,LINQ to SQL 不是实体框架。如果是前者,您可以设置[yourDataContext].Log = Console.Out(或some other stream writer)并获取查询。

在您的查询中,考虑将其编写如下以便能够执行ToString 技巧:

var committeeMemberQuery =
           db.Committee_Member.*WHERE*
           (x => 
              x.Customer_Number == activity.Contact.Number
                 && x.Position_Start_Date.Value.Year == activity.EndDate
                 && x.Committee_Id == activity.Committee.Id && x.Cancelled != 1
           );

var committeeMember = committeeMemberQuery.FirstOrDefault();

现在您可以使用committeeMemberQuery.ToString(),但是您不会获得参数信息(您将使用DataContext.Log = Console.Out,但同样,这不是实体框架,它是 LINQ to SQL。

【讨论】:

  • 我添加了指向其他一些实现的链接。 IMO,“其他流写入器”选项比投票最高的答案更好,因为该选项允许您查看为调用 DataContext.SubmitChanges 时生成的插入/更新操作生成的 sql。
  • [yourDataContext].Database.Log = ,如果您使用的是 DbContext。
  • EF 6 有这个: public Action Log { get;放; }
  • 为什么“WHERE”周围有星号?这太令人困惑了
  • 我要强调的是,不是将谓词放在FirstOrDefault 调用中,而是将其拉到Where 调用中。无法向代码添加其他格式,AFAICT
【解决方案3】:

请参阅https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/linq/how-to-display-linq-to-sql-commands 了解另一种从 linq 中提取 SQL 命令的方法。

更准确地说,下面的 sn-p 显示了用例

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

var q =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

DbCommand dc = db.GetCommand(q);

Console.WriteLine("\nCommand Text: \n{0}",dc.CommandText);
Console.WriteLine("\nCommand Type: {0}",dc.CommandType);
Console.WriteLine("\nConnection: {0}",dc.Connection);

Console.ReadLine();

给出一个输出

Command Text:  
SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactT  
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Coun  
try], [t0].[Phone], [t0].[Fax]  
FROM [dbo].[Customers] AS [t0]  
WHERE [t0].[City] = @p0  

Command Type: Text  

Connection: System.Data.SqlClient.SqlConnection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多