2017-01-24 9 views
0

データベースから読み取った一連の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のようになります。

私は、このように再帰的なクエリや何かを追加していると仮定していますが、わかりません。

パフォーマンスを低下させることなくこれを達成する正しい方法は何ですか?

+0

「私は1つのステップでそれをすべて行う場合はそれが取るのに対し、ほんの数秒 " - それをしたときに使用したコードを表示できますか? –

+0

'lookup = db.RoodDomains.Where(...).Where(...).Where(...)'のようにif文を一切使わずに実行することを意味します。 – Guerrilla

+0

これがSQLサーバーであると仮定して、プロファイリングツールを使用してどのSQLが生成されているか調査しましたか? –

答えて

3

条件をチェーン化する際に、それぞれのステートメントを評価していますか?

私はIQueryableを(例えば、あなたの数)は、データを取得するために行くときにのみ評価すべきであることを意味するとして、あなたの最初の検索を処理すると思う:

IQueryable<RootDomain> lookup = db.RootDomains; 
+0

YES!これで修正されました。ありがとう – Guerrilla

関連する問題