2017-01-24 4 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 использует до 800 Мбайт, и это занимает несколько минут, тогда как если я делаю все это за один шаг, это занимает всего несколько секунд, а ram - как 60mb.

Я предполагаю, что делать это так, это добавление некоторых рекурсивных запросов или что-то, но я не уверен.

Каков правильный путь для достижения этой цели без разрушения производительности?

+0

«, а если я все это в одном шаге он принимает всего несколько секунд "- можете ли вы показать код, который вы использовали, когда вы это сделали? –

+0

Я имею в виду делать это как 'lookup = db.RoodDomains.Where (...) .Where (...) .Where (...)' в одно время без каких-либо операторов if. – Guerrilla

+0

Предполагая, что это SQL-сервер, исследовали ли вы с помощью инструментов профилирования, чтобы узнать, что генерируется SQL? –

ответ

3

Оценивает ли это каждое утверждение, когда вы связываете свои условия?

Я думаю, что лечение ваш первоначальный поиск как IQueryable будет означать, что он должен оценивать только тогда, когда вы идете, чтобы получить данные (например, ваш счет):

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

ДА! Это фиксировало это. благодаря – Guerrilla

Смежные вопросы