如何检测 Linq to SQL 中的 Select n+1 问题?

Posted

技术标签:

【中文标题】如何检测 Linq to SQL 中的 Select n+1 问题?【英文标题】:How to Detect Select n+1 problems in Linq to SQL? 【发布时间】:2009-11-20 15:29:30 【问题描述】:

如果我使用 linq to SQL,检测 Select n+1 问题的最佳方法是什么,现在我们正在处理一个项目,显示一些列表似乎很慢。 检测此问题的最佳方法是什么?

【问题讨论】:

【参考方案1】:

也许这会有所帮助:

http://ayende.com/Blog/archive/2009/11/13/linq-to-sql-profiler-is-now-on-public-beta.aspx http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx http://visualstudiogallery.msdn.microsoft.com/ru-ru/d5a64d5a-174a-4357-ad84-dbeeec030f23

或者您可以使用 SQL Profiler 并检查在您访问单个列表项时是否执行了查询。

【讨论】:

【参考方案2】:

这不会直接检测到 n+1 个问题,但是当您查看生成的 SQL 时,它们很容易发现。

DataContext.Log 属性采用 TextWriter,它将输出生成的 SQL 和一些其他诊断信息。这是一个记录到输出的实现。 Linq to SQL DebuggerWriter。下面是如何使用 DebuggerWriter 的简单示例。

DataContext db = new DataContext();
#if DEBUG
db.Log = new DebuggerWriter();
#endif

【讨论】:

以上是关于如何检测 Linq to SQL 中的 Select n+1 问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 LINQ to SQL 的存储过程中使用临时表

如何轻松地重新排序 LINQ to SQL 设计器中的列?

如何将 SQL 中的多个内部联接转换为 LINQ?

如何将 Predicate<T> 传递给 Linq to SQL 中的 Where() 方法?

如何避免从 LINQ to Entities 中的多个线程从 SQL 数据库中读取相同的记录

LINQ to SQL 中的内部联接的语法是啥?