为什么 LINQ to SQL 会生成多个选择查询?
我正在使用 LINQ2SQL。我刚刚注意到(在 SQL Profiler 中)LINQ 正在为以下 LINQ 生成多个选择语句
var 表数据 = dataContext.TableName.ToList();
SQL 分析器显示以下 DML 语句两次
从表名中选择列名
这是什么原因?
I am using LINQ2SQL. I just noticed (in the SQL Profiler) that LINQ was generating multiple select statements for the below LINQ
var tableData =
dataContext.TableName.ToList();
The SQL profiler shows the below DML statements twice
Select columnNames from TableName
What is the reason for this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
所呈现的查询将只执行一个 select 语句。我想知道这里的问题是否隐藏在将问题转移到一个简单的例子中。很可能在实际代码中它不会将数据推送到列表中。
.Where()
等方法仅组成一个查询 - 它不会将数据加载到列表中,因此以下是 2 个查询:添加
.ToList()
将强制它在单个 TSQL 查询中缓冲在内存中;对该列表的后续枚举将在内存中完成(LINQ 到对象)。当然,您可以非常简单地分析 LINQ-to-SQL 正在执行的内容:
The query as presented will do exactly one select statement. I wonder if the problem here is hidden in moving the question to a simple example. Most likely in the actual code it doesn't push the data into a list. Methods like
.Where()
only compose a query - it doesn't load the data into a list, so the following is 2 queries:Adding a
.ToList()
will force it to buffer in memory in a single TSQL query; subsequent enumeration over the list will be done in memory (LINQ-to-Objects).Of course, you can profile what LINQ-to-SQL is executing pretty simply:
SQL Server Profiler 默认订阅以下事件;
如果您使用这些默认事件启动探查器,您会看到每个批处理语句仅由于
SQL:BatchStarting
和SQL:BatchCompleted
事件而重复两次。这是一个常见的误解,值得检查。SQL Server Profiler subscribes to the following events by default;
If you start the profiler with these default events you see every batch statement repeated 2 times just because of
SQL:BatchStarting
andSQL:BatchCompleted
events. It is a common misconception that worth to be checked.