2012-05-07 4 views
1

내 저장소에서 ToList() 메서드를 사용하여 다른 List를 반환합니다.ToList() 메서드 호출시 데이터베이스 호출

문제는이 반환 된 결과 (즉, 유형 목록)에서 LINQ를 실행하면 데이터베이스 호출도 생성됩니다. 분명히이 두 번째 linq calll 순수한 LINQ Entity 및 데이터베이스를 호출해야합니다 지 않습니다. 내가하고있는 일을 아래에서 보라.

List<User> us = userRepository.GetMany(u => filterStatusIds.Contains(u.UserStatus.Id)); 
if (!string.IsNullOrEmpty(name)) 
us = (from u in us 
     where u.DisplayName.Contains(name) 
     select u).ToList(); // this ToList should not call database 

추가 데이터베이스 호출을 중지 하시려면 도움이나 아이디어가 필요하십니까?

+1

왜 데이터베이스 쿼리를 다시 실행한다고 생각하십니까? 또한 왜 데이터베이스 대신 응용 프로그램에서 필터를 실행합니까? –

+0

@abatishchev :'ToList'에 대한 첫 번째 호출은 linq-to-objects로 전환 할 것이고 결과가 구체화되고 표현식 트리가 사라지기 때문에 되돌릴 방법이 없습니다. –

+0

@Ladislav : 예, 맞습니다. 처음 의견을 읽지 않았습니다. – abatishchev

답변

1

IEnumerable<User> 또는 IQueryable<T>을 리포지토리에서 반환하면 데이터베이스를 쿼리하지 않습니다.

ToList() 다음에 두 번째 호출 만이 작업을 수행합니다.

+0

관심 없음 - 첫 번째 쿼리에서'List '의 반환 형식이 결과 열거를 강제 실행합니까? 나는. 그것은'IEnumerable'과'List' 사이의 캐스트 일뿐만 아니라 결과의 구체화를 포함합니다 ('ToList()'는 함축적입니다)? 그건 분명 나에게 분명해야하지만, 당신이 확인할 수 있다면 기쁠 것입니다. –

+0

필자가 필터링 한 목록 을 사용하여 간단한 예제를 시도했지만 컴파일러에서 'ToList' 호출없이 IEnumerable을 암시 적으로 목록으로 변환 할 수 없다고 말했습니다. 이 예제에서는 다른가? 이 예제의 첫 번째 줄에서는 어떻게 작동합니까? –

+0

@ Joanna : 예, ToArray()/ToList()를 호출하면 materialization이 발생합니다. 따라서 메서드에서 IEnumerable /IQueryable 을 "있는 그대로"반환하면 구체화가 수행되지 않습니다. 첫 번째 m-z 이후에 LINQ에서 Entities, LINQ to Objects로 전환합니다. 즉, 첫 번째 필터링 결과를 서버 메모리에로드하고 다음 필터마다 메모리에 열거합니다. – abatishchev