5

由于有时会创建疯狂的 SQL,因此分析 LINQ 查询及其执行计划尤其重要。

我经常发现我需要跟踪特定查询并且很难在查询分析器中找到。我经常在有很多正在运行的事务(有时是生产服务器)的数据库上执行此操作 - 所以仅仅打开 Profiler 是不好的。

我还发现尝试使用 DataContext 来跟踪是不够的,因为它没有给我 SQL,我实际上可以自己执行。

到目前为止,我最好的策略是在我的查询中添加一个“随机”数字,并在跟踪中对其进行过滤。

林克:

where o.CompletedOrderID != "59872547981"

分析器过滤器:

'TextData' like '%59872547981'

这适用于几个警告:

  • 我必须小心记住删除条件,或者选择不会过多影响查询计划的东西。是的,我知道把它留在里面是自找麻烦。
  • 据我所知,即使使用这种方法,我也需要为我需要跟踪的每个 LINQ 查询启动一个新的跟踪。如果我转到现有跟踪的“文件 > 属性”,则无法更改过滤条件。

您无法在您的应用程序中运行查询并在 Profiler 中看到它,而无需任何额外的努力。只是希望其他人想出了比这更好的方法,或者至少建议搜索一个比在列上查询更“危险”的标记。

4

4 回答 4

5

弄乱 where 子句可能不是最好的做法,因为它可以并且会影响查询的执行计划。

用投影到匿名类来做一些时髦的事情 - 使用唯一的静态列名或不会影响执行计划的东西。(这样你就可以在生产代码中保持原样,以防你以后需要对生产代码进行任何分析......)

from someobject in dc.SomeTable
where someobject.xyz = 123
select new { MyObject = someobject, QueryTraceID1234132412='boo' }
于 2008-11-25T02:50:08.133 回答
3

您可以使用 Linq to SQL Debug Visualiser - http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx并在您的监视窗口中查看它。

或者,您可以DataContext.GetCommand();在 SQL 执行之前使用它来查看它。

您还可以查看DataContext.GetChangeSet()以查看将要插入/更新或删除的内容。

于 2008-11-25T03:38:14.293 回答
1

您可以让您的 datacontext 注销原始 SQL,然后您可以在分析器中搜索它以检查性能。

using System.Diagnostics.Debugger;

yourDataContext.Log = new DebuggerWriter();

现在,您的所有 SQL 查询都将显示在调试器输出窗口中。

于 2008-11-25T02:40:12.913 回答
1

EFCore 有一个TagWith()专门用于此目的的功能。

 var nearestFriends =
      (from f in context.Friends.TagWith("This is my spatial query!")
      orderby f.Location.Distance(myLocation) descending
      select f).Take(5).ToList();

https://docs.microsoft.com/en-us/ef/core/querying/tags

不幸的是,您无法使用查询存储找到它们:-)

这是因为查询的注释被去掉了

真可惜!希望我不必再等12年。

于 2020-02-06T05:17:44.837 回答