c#foreach循环迭代,从查询执行时间开始使用列表
这是Marly我需要的信息 当我使用C#在列表上进行foreach循环时,如下所示:c#foreach循环迭代,从查询执行时间开始使用列表,c#,sql,sqlite,foreach,asp.net-core-3.1,C#,Sql,Sqlite,Foreach,Asp.net Core 3.1,这是Marly我需要的信息 当我使用C#在列表上进行foreach循环时,如下所示: foreach (var record in DbContext.UserRecords.Where(record => record.UserId == user.Id && record.Date.Date == startDate.AddDays(i).Da
foreach (var record in DbContext.UserRecords.Where(record => record.UserId == user.Id &&
record.Date.Date == startDate.AddDays(i).Date)
.ToList())
{
totHours += record.Hours;
}
每一个周期到底发生了什么?查询是否再次发生,因此我对列表中的每个项目都有N个查询到DB,或者它只是第一次这样做,然后循环保留数据的临时副本?
我正在尝试在我的ASP.Net项目中优化时间,我想知道是否有更干净/更快的方法来迭代这些长数据流
非常感谢 否,在执行查询并将数据加载到内存的IQueryable
上调用ToList()
然后对内存中的对象执行每个迭代
即使没有ToList()
,查询也会执行一次,数据会从数据库中流出
虽然内存效率更高,但在循环期间,它会锁定基础表,因此您需要熟悉这种方法。如果您试图优化项目,您应该通过探查器运行它,而不是猜测!此外,如果只是对小时数求和,则可以让查询只返回小时数之和
totHours+=DbContext.UserRecords.Where(/*conditions*/).Sum(record=>record.Hours)代码>@itsme86我喜欢这种超级精简的方法!谢谢你的主意!我也想了解lil。虽然我知道EF。但特别是在这个循环中。调用as.ToList()
。不是每次迭代都会一次又一次地调用它吗?根据您在“开始”中所说的,实际查询将对数据库执行一次,然后在每次迭代后,在内存中提取的记录将用于执行迭代?@RaoHammas否,
中之后的表达式将被计算一次为IEnumerable
。使用ToList()
,这是一个列表
,它是内存中的对象。如果没有ToList()
的话,IEnumerable
会导致每次迭代时数据都会被蒸出来。@JohnathanBarclay谢谢,先生,这是Marly我需要的一个确认,我以为它是按照您描述的方式进行的,但我只是想确认一下。。。有时候我会犯非常可怕的错误,检查两次从来都不是一个坏主意