LINQ to Entities这么慢?

时间:2012-12-02 21:41:35

标签: .net linq entity-framework linq-to-entities

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

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

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

TrainingProgramHistory_ConditionAndLoadParameter和TrainingProgramHistory_ConditionAndLoadParameter.ConditionAndLoadParameters在内存中,因为执行这些查询时,SQL配置文件不会记录任何内容。

每个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实体的速度如何?我做错了什么?

1 个答案:

答案 0 :(得分:1)

好的,我的不好:(

第一个片段在一个方法中,其中包含一个log / trace-line,显然在其中使用了lock() - s,即使这个方法是从同一个线程调用的,调用这些锁也会降低性能。

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