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 個の TPH エンティティで) 25 回実行すると、約 3 秒かかります。
これにリファクタリングすると:
List<ConditionAndLoadParameter> measuredCalps = new List<ConditionAndLoadParameter>();
foreach (TrainingProgramHistory_ConditionAndLoadParameter tphCalp in actTph.TrainingProgramHistory_ConditionAndLoadParameter)
{
if (tphCalp.Level == 10)
{
measuredCalps.Add(tphCalp.ConditionAndLoadParameter);
}
}
その後、100msec程度で実行されます。
Linq to Entities がメモリ内オブジェクトに対してこれほど遅いのはなぜですか? 私は何を間違っていますか?