1

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

var tableData = 数据上下文。表名.ToList ();

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

TableName中选择columnNames

这是什么原因?

4

2 回答 2

9

呈现的查询将只执行一个 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
于 2011-01-31T12:08:13.243 回答
6

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

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

如果您使用这些默认事件启动分析器,您会看到每个批处理语句都重复了 2 次,只是因为SQL:BatchStartingSQL:BatchCompleted事件。这是一个普遍的误解,值得检查。

于 2011-02-26T15:02:46.147 回答