我的程序中发生了一件非常奇怪的事情:
我在一个集合上进行了这个查询 agt.DefaultNr == 1 并获得了3项作为结果:
IEnumerable<Agent> favAgents =
from agt in builtAgents where agt.DefaultNr == 1 select agt;
对于我设置 DefaultNr = 0
的每个项目foreach (Agent noFavAgt in favAgents)
{
noFavAgt.DefaultNr = 0;
}
我做了另一个查询,但由于某种原因,我的favAgents集合现在是空的!
IEnumerable<Agent> smallAgents = (from agt in favAgents
where agt.tempResultCount < 30
orderby agt.tempResultCount descending
select agt);
这里发生了什么?
这是LINQ延迟加载问题吗?
在我设置所有项目= 0之后看起来会有某种重新查询,因为我的收藏是空的!
答案 0 :(得分:11)
这不是延迟加载,它是延迟执行。定义初始可枚举时,您将定义查询,而不是集合。你是正确的,它正在进行重新查询;每次迭代favAgents
时,它都会执行您定义的查询。如果要根据不会更改的查询创建列表,请添加ToList()
。
var favAgents =
(from agt in builtAgents where agt.DefaultNr == 1 select agt).ToList();
执行此操作将在内存中创建一个列表,并在该时间点缓存查询结果。
答案 1 :(得分:6)
是的,您的favAgents
集合现在将为空 - 您已“关闭”其中每个元素中的位使其与查询匹配!如果迭代favAgents
两次,它将执行两次查询。 favAgents
代表查询本身,不结果。
如果您想保留一组特定的结果,请使用ToList
或类似的内容:
favAgents = favAgents.ToList();
这将实现查询 - 执行一次,然后基本记住列表中的结果。 ToArray
会产生相同的效果,但会将结果存储在数组中。