我在上下文(内存)中有实体,因为我用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实体的速度如何?我做错了什么?
答案 0 :(得分:1)
好的,我的不好:(
第一个片段在一个方法中,其中包含一个log / trace-line,显然在其中使用了lock() - s,即使这个方法是从同一个线程调用的,调用这些锁也会降低性能。
在这种情况下,foreach和linq查询在删除锁之后产生了相同的性能。