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

发布于 2024-10-15 00:00:31 字数 270 浏览 1 评论 0原文

我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绮烟 2024-10-22 00:00:31

所呈现的查询将只执行一个 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 到对象)。

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

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

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:

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

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:

dataContext.Log = Console.Out; // or any other text-writer
倒数 2024-10-22 00:00:31

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

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

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

SQL Server Profiler subscribes to the following events by default;

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

If you start the profiler with these default events you see every batch statement repeated 2 times just because of SQL:BatchStarting and SQL:BatchCompleted events. It is a common misconception that worth to be checked.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文