【问题标题】:Is ToList required when using foreach with LINQ to Entities将 foreach 与 LINQ to Entities 一起使用时是否需要 ToList
【发布时间】:2019-08-30 00:52:45
【问题描述】:

我有一个关于 LINQ 如何使用 foreach 处理来自 Entity Framework 的可查询实体的性能问题。

这两种方法是否更好(更快)

foreach(var thing in myentities.GetThemAll())

foreach(var thing in myentities.GetThemAll().ToList())

第一个示例实际上会导致myentities.GetThemAll().Count() (+1 ?) 访问数据库,每次收集一行吗?

【问题讨论】:

    标签: c# linq entity-framework linq-to-entities


    【解决方案1】:

    如果你只需要遍历你的元素而不调用ToList(),那就更好了。这是因为当我们调用它时,会触发相应查询的立即执行,并会在内存集合中创建一个。

    如果您不调用ToList,您将避免创建用于保存查询结果的内存集合。

    要么遵循第一种方式,要么遵循第二种方式,您将往返于数据库。

    【讨论】:

    • 因此,如果我只是对实体查询进行 foreach,它仍然会只执行一个查询(以获取所有结果)然后在内存中迭代它们,而不是为每个结果返回数据库?
    • 感谢您的洞察力,但是这与这个相反的问题如何匹配? stackoverflow.com/questions/3575886/…
    • 调用 ToList 将结果带入内存
    • @Chris 请注意已接受答案下的第一条评论,The whole collection is fetched when the enumerator is first used。当我们使用foreach 时,我们会得到一个Enumerator,这将帮助我们遍历序列中的元素。
    【解决方案2】:

    这里有一个平衡点,这取决于上下文。

    第一个流式传输来自数据库的结果,因此不会一次将其全部加载到内存中,如果您只需要迭代一次,并且客户端知道他们正在处理来自数据库。它节省了内存和初始执行时间。

    使用 ToList() 它将执行完整的查询,并在执行 foreach 之前将每个项目加载到内存中。这有助于您一次性访问所有数据,如果您将在方法中多次引用可枚举对象或不想长时间保持连接打开,这可能会很有帮助。

    如果内存是个问题,请选择第一个,否则,在处理存储库之外的实体框架时,使用 ToList() 可能更简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多