Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#foreach循环迭代,从查询执行时间开始使用列表_C#_Sql_Sqlite_Foreach_Asp.net Core 3.1 - Fatal编程技术网

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

这是Marly我需要的信息

当我使用C#在列表上进行foreach循环时,如下所示:

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我需要的一个确认,我以为它是按照您描述的方式进行的,但我只是想确认一下。。。有时候我会犯非常可怕的错误,检查两次从来都不是一个坏主意