这是一个LINQ延迟加载问题吗?

Tal*_*ode 5 linq

在我的程序中发生了一些非常奇怪的事情:

我对一个集合进行了这个查询agt.DefaultNr == 1并得到3个结果作为结果:

IEnumerable<Agent> favAgents =
            from agt in builtAgents where agt.DefaultNr == 1 select agt;
Run Code Online (Sandbox Code Playgroud)

对于每个项目,我设置DefaultNr = 0

foreach (Agent noFavAgt in favAgents)
{
    noFavAgt.DefaultNr = 0;
}
Run Code Online (Sandbox Code Playgroud)

我做了另一个查询,但由于某种原因,我的favAgents集合现在是空的!

IEnumerable<Agent> smallAgents = (from agt in favAgents
    where agt.tempResultCount < 30
    orderby agt.tempResultCount descending
    select agt);
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

这是一个LINQ延迟加载问题吗?

在我设置所有项目= 0之后看起来会有某种重新查询,因为我的收藏是空的!

Ada*_*son 11

这不是延迟加载,它是延迟执行.定义初始可枚举时,您将定义查询,而不是集合.你是正确的,它正在进行重新查询; 每次迭代时favAgents,它都会执行您定义的查询.如果要根据不更改的查询创建列表,请添加ToList().

var favAgents = 
    (from agt in builtAgents where agt.DefaultNr == 1 select agt).ToList();
Run Code Online (Sandbox Code Playgroud)

执行此操作将在内存中创建一个列表,并在该时间点缓存查询结果.


Jon*_*eet 6

是的,你的favAgents收藏品现在将是空的 - 你已经"关闭"它的每个元素中的位,使其与查询匹配!如果迭代favAgents两次,它将执行两次查询.favAgents表示查询本身,而不是结果.

如果要保留一组特定结果,请使用ToList或类似的东西:

favAgents = favAgents.ToList();
Run Code Online (Sandbox Code Playgroud)

这将实现查询 - 执行一次,然后基本上记住列表中的结果.ToArray会产生相同的效果,但会将结果存储在数组中.