使用带有LINQ to Entities的foreach时需要ToList

时间:2014-11-13 17:20:56

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

我有一个关于LINQ如何使用foreach对来自实体框架的可查询实体执行的性能问题。

做得更好(也更快)

foreach(var thing in myentities.GetThemAll())

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

第一个示例是否实际导致myentities.GetThemAll().Count()(+1?)跳转到每个收集一行的数据库?

2 个答案:

答案 0 :(得分:5)

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

如果你不打电话给ToList,你将避免创建能够保存查询结果的内存集合。

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

答案 1 :(得分:2)

这里要取得平衡,这取决于具体情况。

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

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

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