为什么LINQ to SQL会生成多个选择查询?

时间:2011-01-31 11:46:39

标签: .net linq-to-sql sqlprofiler

我正在使用LINQ2SQL。我刚刚注意到(在SQL Profiler中)LINQ为下面的LINQ生成多个select语句

  

var tableData =   DataContext的表名 .ToList();

SQL分析器显示以下DML语句两次

  

TableName

中选择 columnNames

这是什么原因?

2 个答案:

答案 0 :(得分:9)

显示的查询将只执行一个select语句。我想知道这里的问题是否隐藏在将问题转移到一个简单的例子中。最有可能在实际代码中,它不会将数据推送到列表中。像.Where()这样的方法撰写 查询 - 它不会将数据加载到列表中,因此以下是2个查询:

var tableData = dataContext.TableName.Where(row => row.Foo == bar);
foreach(var items in tableData) {...}
foreach(var items in tableData) {...}

添加.ToList()会强制它在单个TSQL查询中缓冲内存;列表上的后续枚举将在内存中完成(LINQ-to-Objects)。

当然,您可以简单地分析LINQ-to-SQL正在执行的内容:

dataContext.Log = Console.Out; // or any other text-writer

答案 1 :(得分:6)

默认情况下,SQL Server Profiler订阅以下事件;

Audit Login
Audit Logout
Existing Connection
RPC:Completed
SQL:BatchCompleted
SQL:BatchStarting

如果您使用这些默认事件启动探查器,您会看到每个批处理语句仅因SQL:BatchStartingSQL:BatchCompleted事件而重复2次。这是一个值得检查的常见误解。