我正在使用LINQ2SQL。我刚刚注意到(在SQL Profiler中)LINQ为下面的LINQ生成多个select语句
var tableData = DataContext的表名 .ToList();
SQL分析器显示以下DML语句两次
从 TableName
中选择 columnNames
这是什么原因?
答案 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:BatchStarting
和SQL:BatchCompleted
事件而重复2次。这是一个值得检查的常见误解。