データベースから読み取った一連のbool値に基づいてルックアップを変更する関数を作成したいとします。パフォーマンスが非常に悪い検索の変更
私はこのようなアプローチを取ってみました:
IEnumerable<RootDomain> lookup = db.RootDomains;
//bools are nullable
if (conditions.HasCompanyMatch == true) lookup = lookup.Where(x => x.Companies.Any(c => c.CompanyMatches.Count > 1));
if (conditions.HasCompanyMatch == false) lookup = lookup.Where(x => !x.Companies.Any(c => c.CompanyMatches.Count > 1));
if (conditions.HasEmail == true) lookup = lookup.Where(x => x.EmailMessages.Count() > 1);
// etc.. more bool switches
//very slow when it enumerated in any way
var count = lookup.Count();
それは動作しますが、それは非常に遅いです。列挙可能なルックアップが列挙されるとき、RAMの使用量は約800MBにジャンプし、数分かかるのに対し、私は1つのステップで数秒かかるだけで、RAMは60MBのようになります。
私は、このように再帰的なクエリや何かを追加していると仮定していますが、わかりません。
パフォーマンスを低下させることなくこれを達成する正しい方法は何ですか?
「私は1つのステップでそれをすべて行う場合はそれが取るのに対し、ほんの数秒 " - それをしたときに使用したコードを表示できますか? –
'lookup = db.RoodDomains.Where(...).Where(...).Where(...)'のようにif文を一切使わずに実行することを意味します。 – Guerrilla
これがSQLサーバーであると仮定して、プロファイリングツールを使用してどのSQLが生成されているか調査しましたか? –