0

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 がメモリ内オブジェクトに対してこれほど遅いのはなぜですか? 私は何を間違っていますか?

4

1 に答える 1

1

OK、私が悪かった:(

最初のスニペットは、内部で lock() を使用していると思われるログ/トレースラインを含むメソッド内にあり、このメソッドが同じスレッドから呼び出されたにもかかわらず、これらのロックを呼び出すとパフォーマンスが低下しました。

この場合、foreach および linq クエリは、ロックを削除した後、ほぼ同じパフォーマンスを生成しました。

于 2012-12-02T22:01:28.910 に答える