gpt4 book ai didi

LINQ to SQL 延迟执行和实现

转载 作者:行者123 更新时间:2023-12-01 01:10:29 25 4
gpt4 key购买 nike

我对此有点陌生。好奇以下情况会发生什么?

var q = //MY LINQ TO SQL QUERY.Select(...)
.........
.........
var c = q.Count();
.........
.........
var x = q.Where(....).Select(....);
var y = x.ToList();//or something such that forces materialization
var d = q.Count();//same as c
var e = x.Count();
var f = y.Count();

sql 语句实际访问数据库多少次?一次在 Count()。再次在哪里()?还是 Linq 保留了它在 Count() 期间实现的内容?

或者它也取决于 Where(..) 有什么?就像它再次引用数据库与它只是引用作为'q'/或任何其他.net集合等的一部分获得的内容一样?

编辑:

用其他几个场景更新了我的代码。请在下面更正我的答案:
q -no db trip
c -yes, but translates to aggregate qry - select Count(*) and not a result set (as per answer below)
x -no db trip. No matter what is written in the Where(..)
y - yes
d - yes - does not *reuse* c
e - yes - select count(*) EVEN THOUGH x already materized during y
f - no db trip

最佳答案

当您调用 Count它不会实现整个数据集。相反,它准备并执行一个查询,如

SELECT COUNT(*) FROM ...

使用 ExecuteScalar得到结果。

当您调用 WhereSelect它不会实现任何东西(假设 qIQueryable )。相反,它只是准备一个查询,例如
SELECT col1, col2, ... FROM ...

但它实际上并没有在那时执行它。它只会在你调用 GetEnumerator 时执行查询。在 q .您很少会直接执行此操作,但类似以下的任何操作都会导致您的查询被执行:
var arry = q.ToArray();
var list = q.ToList();
foreach(var rec in q) ...

它只会执行一次这个查询,所以有多个 foreach循环不会创建多个数据库查询。当然,如果你创建一个新的 IQueryable基于 q (例如 var q2 = q.Where(...) )它不会绑定(bind)到 q 使用的结果集,所以它必须再次查询数据库。

我在 LINQPad 中测试了您的代码,看来您的所有分析都是正确的。

关于LINQ to SQL 延迟执行和实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15684481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com