我读过很多关于这个主题的文章,但我仍然很困惑。 这是我所知道的(我写的内容与使用 LINQ 查询数据库有关):
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(它在幕后如何工作)。
var filteredRecords = _context.MyTable.AsNoTracking().Where(...).ToList();
var filteredRecords = _context.MyTable.AsNoTracking().Where(...).ToList();
我应该使用哪一个? FilteredRecords 将作为响应发送给客户端(例如 Angular)
AsEnumerable
视为具体化数据库查询。如果您计划执行进一步的 LINQ 操作,则几乎应始终将查询保留为 IQueryable
。某些 LINQ 操作无法使用某些数据库提供程序执行,在这种情况下,您必须使用 AsEnumerable
(或重写查询)。ToList
(或 ToArray
或任何其他此类替代方案)。如果您只计划迭代一次,那么使用 AsEnumerable
可以是有益的。某些数据库提供程序可以从数据库执行流式或缓冲读取,因此不需要将所有返回的记录保留在内存中。这可能只是预期返回大量记录的查询所关心的问题。