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

Mir*_*ral 1 .net sql-server-profiler linq-to-sql

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

var tableData = dataContext.TableName .ToList();

SQL事件探查器显示以下DML语句两次

TableName中选择columnNames

这是什么原因?

Mar*_*ell 9

查询所呈现将会做一个select语句.我想知道这里的问题是否隐藏在将问题转移到一个简单的例子中.最有可能在实际代码中,它不会将数据推送到列表中.类似的方法.Where()构成一个查询 -它并不将数据加载到一个列表,所以下面是2个查询:

var tableData = dataContext.TableName.Where(row => row.Foo == bar);
foreach(var items in tableData) {...}
foreach(var items in tableData) {...}
Run Code Online (Sandbox Code Playgroud)

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

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

dataContext.Log = Console.Out; // or any other text-writer
Run Code Online (Sandbox Code Playgroud)

  • @vtortola,当我看到一个复制品时,我会相信的 (6认同)

小智 6

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

Audit Login
Audit Logout
Existing Connection
RPC:Completed
SQL:BatchCompleted
SQL:BatchStarting
Run Code Online (Sandbox Code Playgroud)

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