Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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# 有人能帮我找到这段代码中的瓶颈吗?_C#_Entity Framework_Optimization - Fatal编程技术网

C# 有人能帮我找到这段代码中的瓶颈吗?

C# 有人能帮我找到这段代码中的瓶颈吗?,c#,entity-framework,optimization,C#,Entity Framework,Optimization,我在一个循环中运行了大约5000次以下代码块 IQueryable<IGrouping<int?, StatusLog>> allLogs = db.StatusLogs .Where(sl => sl.ID.Value.Equals(foo)) .GroupBy(sl=>sl.bar); List<StatusLog> statusLogs = new List<StatusLog>(); foreach (var

我在一个循环中运行了大约5000次以下代码块

IQueryable<IGrouping<int?, StatusLog>> allLogs = db.StatusLogs
    .Where(sl => sl.ID.Value.Equals(foo))
    .GroupBy(sl=>sl.bar);

List<StatusLog> statusLogs = new List<StatusLog>();

foreach (var group in allLogs)
{
    // do stuff that adds to statusLogs
}

if (statusLogs.Count > 0)
{
    // do stuff
}


在所有日志中单步执行
var组
的求值只需要3毫秒左右,那么当
foreach
循环中的代码甚至没有运行时,跳转到下一条语句怎么需要50毫秒呢

将其拆分为db访问,然后再拆分为for循环和每个循环的时间(使用秒表类)


这是因为
allLogs
本质上是惰性的——当在
foreach
中首次枚举时,它实际上会命中数据库(请参阅“延迟查询执行”)。如果您像下面这样将收集物化,您将看到它快速地通过
foreach

db.StatusLogs
    .Where(sl => sl.ID.Value.Equals(foo))
    .GroupBy(sl=>sl.bar)
    .ToList();  // <-- pull the query results into memory
db.StatusLogs
其中(sl=>sl.ID.Value.Equals(foo))
.GroupBy(sl=>sl.bar)

.ToList();//您必须提供更多的代码。与系统时钟分辨率相比,50ms的时间相当短。这次你是怎么测量的?您确定其他进程在测量时没有占用大量CPU吗?您认为到数据库的往返是免费的吗?就记录而言,这并没有解决问题,它只移动到发生50毫秒的地方。我只是接受了一个答案,希望一连串的反对票能结束。@iMassakre这里没有问题要解决。无论在哪里进行数据库调用,都需要时间。我只是想解释为什么在你的情况下通过foreach需要时间。哦,我明白你的意思了。那么我想没有办法解决这个问题了。生成一份包含5000项的报告需要13分钟,这似乎太疯狂了。
if (statusLogs.Count > 0)
var allLogs = db.StatusLogs
    .Where(sl => sl.ID.Value.Equals(foo))
    .GroupBy(sl=>sl.bar).ToList();// tolist forces query to run now

foreach (var group in allLogs)
{
    // do stuff that adds to statusLogs
}
db.StatusLogs
    .Where(sl => sl.ID.Value.Equals(foo))
    .GroupBy(sl=>sl.bar)
    .ToList();  // <-- pull the query results into memory