代码之家  ›  专栏  ›  技术社区  ›  TalkingCode

这是LINQ延迟加载问题吗?

  •  5
  • TalkingCode  · 技术社区  · 14 年前

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

    我提出这个问题 agt.defaultnr==1 在一个集合中获取3项结果:

    IEnumerable<Agent> favAgents =
                from agt in builtAgents where agt.DefaultNr == 1 select agt;
    

    对于我设置的每一项 DeffTrnr=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之后会有某种重新查询,因为我的集合是空的!

    2 回复  |  直到 14 年前
        1
  •  11
  •   Adam Robinson    14 年前

    这不是 延迟加载 它是 延迟执行 . 当您定义初始可枚举时,您定义的是 查询 不是 收集 . 你是正确的,它在执行一个查询;每次你重复 favAgents ,它将执行您定义的查询。如果要基于未更改的查询创建列表,请添加 ToList() .

    var favAgents = 
        (from agt in builtAgents where agt.DefaultNr == 1 select agt).ToList();
    

    这样做将在内存中创建一个列表,并在该时间点缓存查询结果。

        2
  •  6
  •   Jon Skeet    14 年前

    是的,你的 favAgents 集合现在将为空-您已经“关闭”了使其与查询匹配的每个元素中的位!如果你重复 蚕豆蛋白 它将执行两次查询。 蚕豆蛋白 表示查询本身, 结果。

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

    favAgents = favAgents.ToList();
    

    那将 物化 查询-执行一次,然后基本上在列表中记住结果。 ToArray 效果相同,但将结果存储在数组中。