我正在使用 LINQ2SQL。我刚刚注意到(在 SQL Profiler 中)LINQ 正在为以下 LINQ 生成多个选择语句
var tableData = 数据上下文。表名.ToList ();
SQL 分析器两次显示以下 DML 语句
从TableName中选择columnNames
这是什么原因?
我正在使用 LINQ2SQL。我刚刚注意到(在 SQL Profiler 中)LINQ 正在为以下 LINQ 生成多个选择语句
var tableData = 数据上下文。表名.ToList ();
SQL 分析器两次显示以下 DML 语句
从TableName中选择columnNames
这是什么原因?
呈现的查询将只执行一个 select 语句。我想知道这里的问题是否隐藏在将问题转移到一个简单的例子中。很可能在实际代码中它不会将数据推送到列表中。诸如.Where()
仅组成查询之类的方法- 它不会将数据加载到列表中,因此以下是 2 个查询:
var tableData = dataContext.TableName.Where(row => row.Foo == bar);
foreach(var items in tableData) {...}
foreach(var items in tableData) {...}
添加 a.ToList()
将强制它在单个 TSQL 查询中缓冲在内存中;随后对列表的枚举将在内存中完成(LINQ-to-Objects)。
当然,您可以非常简单地分析 LINQ-to-SQL 正在执行的内容:
dataContext.Log = Console.Out; // or any other text-writer
SQL Server Profiler 默认订阅以下事件;
Audit Login
Audit Logout
Existing Connection
RPC:Completed
SQL:BatchCompleted
SQL:BatchStarting
如果您使用这些默认事件启动分析器,您会看到每个批处理语句都重复了 2 次,只是因为SQL:BatchStarting
和SQL:BatchCompleted
事件。这是一个普遍的误解,值得检查。