0

我在上下文(内存)中有实体,因为我用 Include() 加载了它们。

我有大约 25 个实体 (tph),我正在对每个实体运行以下查询:

actTph.TrainingProgramHistory_ConditionAndLoadParameter.Where(x => x.Level == 10).Select(x => x.ConditionAndLoadParameter).ToArray();

TrainingProgramHistory_ConditionAndLoadParameter 和 TrainingProgramHistory_ConditionAndLoadParameter.ConditionAndLoadParameters 在内存中,因为执行这些查询时,SQL-profile 什么也不记录。

每个 TPH 有大约 20 个 TrainingProgramHistory_ConditionAndLoadParameter 相关实体。

运行此查询 25 次(在我的 25 个 TPH 实体上)大约需要 3 秒!

如果我重构这个:

List<ConditionAndLoadParameter> measuredCalps = new List<ConditionAndLoadParameter>();
                    foreach (TrainingProgramHistory_ConditionAndLoadParameter tphCalp in actTph.TrainingProgramHistory_ConditionAndLoadParameter)
                    {
                        if (tphCalp.Level == 10)
                        {
                            measuredCalps.Add(tphCalp.ConditionAndLoadParameter);
                        }
                    }

然后它在 100 毫秒左右运行。

对于内存中的对象,Linq to Entities 怎么这么慢?我究竟做错了什么?

4

1 回答 1

1

好吧,是我的错:(

第一个片段在一个方法中,其中包含一个日志/跟踪行,其中显然使用了 lock()-s,即使从同一个线程调用此方法,调用这些锁也会降低性能。

在这种情况下,foreach 和 linq 查询在移除锁后产生了大致相同的性能。

于 2012-12-02T22:01:28.910 回答