2017-01-24 1 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로 점프되며 몇 분이 걸리는 반면 한 번에 모두 수행하면 단 몇 초만 소요되고 램은 60MB와 비슷합니다.

나는 이렇게하는 것이 재귀적인 쿼리를 추가한다고 가정하고 있지만 잘 모르겠습니다.

성능을 저하시키지 않고이를 달성하는 올바른 방법은 무엇입니까?

+0

"반면이 걸리는 : 난 당신이 데이터 (예를 들어, 당신의 수를) 검색 할 갈 때 그것은 단지 평가해야한다는 것을 의미한다을 IQueryable로 초기 조회를 치료하는 생각

몇 초 "- 그렇게했을 때 사용한 코드를 보여줄 수 있습니까? –

+0

'lookup = db.RoodDomains.Where (...) .Where (...) .Where (...)'와 같이 if 문을 사용하지 않고 수행하는 것을 의미합니다. – Guerrilla

+0

이것이 SQL 서버라고 가정하고 프로파일 링 도구를 사용하여 생성되는 SQL을 조사해 보셨습니까? –

답변

3

조건을 연결하는대로 각 문장을 평가합니까? 나는 한 번에 모든 것을 할 경우

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

예! 이 문제가 해결되었습니다. 감사 – Guerrilla

관련 문제