私はこれを一般的なブードゥー教のせいにするのではなく、理解しようとしています。
EF クエリを実行してデータを取得する.ToList()
と、次のようになります。
IEnumerable<DatabaseMatch<CatName>> nameMatches = nameLogicMatcher.Match(myIQueryableOfCats).ToList();
一部の猫は複数の名前を持っているため、データベースに 2 回表示されますが、各猫には主な名前があります。したがって、これをフィルタリングするために、リスト内の猫のすべての ID を取得します。
List<int> catIds = nameMatches.Select(c => c.Match.CatId).ToList();
次に、すべての個別の ID を反復処理し、一致するすべての猫の名前を取得し、次のようにリストから主要な名前ではないものをすべて削除します。
foreach (int catId in catIds.Distinct())
{
var allCatNameMatches = nameMatches.Where(c => c.Match.CatId == catId);
var primaryMatch = allCatNameMatches.FirstOrDefault(c => c.Match.NameType == "Primary Name");
nameMatches = nameMatches.Except(allCatNameMatches.Where(c => c != primaryMatch));
}
このコードは、最初に実行したときにハングしました。変だと思ったもの。私はそれを一歩踏み出しましたが、うまくいくように見えましたが、10回の反復の後(合計で100匹の猫に制限されています)、速度が低下し始め、最終的には氷河になり、完全にハングしました.
誤って集中的なデータベース作業を行っているのではないかと思いましたが、プロファイラーは、猫の名前の初期リストを取得する以外に実行された SQL を示していません。
IEnumerable
nameMatches から aに変更し、最後の行List
に適切なものを配置することにしました。.ToList()
これを行った後、すぐに完全に機能しました。
私が聞きたい質問は、なぜですか?