IEnumerable 与 List - 使用哪个(内存和性能)

问题描述 投票:0回答:1

我读过很多关于这个主题的文章,但我仍然很困惑。 这是我所知道的(我写的内容与使用 LINQ 查询数据库有关):

  • AsEnumerable() 将在每次迭代集合或调用一些需要枚举的 LINQ 方法(Min、Max、ToList、FirstOrDefault 等)时执行查询 - “延迟加载”
  • ToList() 将立即执行查询
  1. 如果我对集合执行很多操作,我应该使用 ToList() 以避免多次查询数据库。在以下情况下:
var test = _context.MyTable.Where(w => w.Conditions...).AsEnumerable(); // db returns 20 records
test.Where(w => w.Conditions); // from 20 records, I only have 10 now

是否会先将 20 条记录加载到内存中,然后再加载 10 条记录,还是从一开始就加载 10 条记录?我试图了解何时应该使用 IEnumerable 而不是 List(它在幕后如何工作)。

  1. 当所有过滤完成后,我应该使用 IEnumerable 还是 List(或者没关系 - 性能相似)? 示例:
var filteredRecords = _context.MyTable.AsNoTracking().Where(...).ToList();
var filteredRecords = _context.MyTable.AsNoTracking().Where(...).ToList();

我应该使用哪一个? FilteredRecords 将作为响应发送给客户端(例如 Angular)

.net entity-framework linq
1个回答
0
投票
  1. 在这种情况下,将从数据库加载 20 条记录。您可以将
    AsEnumerable
    视为具体化数据库查询。如果您计划执行进一步的 LINQ 操作,则几乎应始终将查询保留为
    IQueryable
    。某些 LINQ 操作无法使用某些数据库提供程序执行,在这种情况下,您必须使用
    AsEnumerable
    (或重写查询)。
  2. 这要看情况。正如您自己所发现的,如果您计划多次迭代该序列,您应该使用
    ToList
    (或
    ToArray
    或任何其他此类替代方案)。如果您只计划迭代一次,那么使用 AsEnumerable
    可以
    是有益的。某些数据库提供程序可以从数据库执行流式或缓冲读取,因此不需要将所有返回的记录保留在内存中。这可能只是预期返回大量记录的查询所关心的问题。
© www.soinside.com 2019 - 2024. All rights reserved.