2011-04-23 3 views
0

쿼리에서 반환 한 시퀀스가 ​​실제로 반복 될 때까지 Linq 쿼리가 실행되지 않습니다.메서드 내에서 Linq 쿼리를 사용하면 지연된 실행에 영향을 줍니까?

나는 반복적으로 사용되는 쿼리를 가지고 있으므로 메서드 내에서 그것을 encapuslate 할 것입니다. 지연된 실행을 방해하는지 알고 싶습니다.
Linq 쿼리를 다음과 같은 메서드로 캡슐화하면 쿼리는 메서드가 호출되는 줄 1이 아니라 2 줄에서 실행됩니다. 이 올바른지?

public IEnumerable<Person> GetOldPeopleQuery() 
{ 
    return personList.Where(p => p.Age > 60); 
} 

public void SomeOtherMethod() 
{ 
    var getWomenQuery = GetOldPeopleQuery().Where(p => p.Gender == "F"); //line 1 
    int numberOfOldWomen = getWomanQuery.Count(); //line 2 
} 

P. 어떤 차이가 있다면 Linq-To-EF를 사용하고 있습니다.

답변

2

첫 번째 결과를 열거 할 때 쿼리가 지연 평가됩니다. 즉, 결과를 메서드 내에 넣으면 영향을받지 않습니다.

그러나 코드에는 매우 비효율적 인 또 다른 것이 있습니다. IEnumerable을 반환하면 컬렉션에 적용된 다음 linq 문은 linq-to-objects 쿼리가됩니다. 즉, 귀하의 경우에는 을 모두 데이터베이스의 노약자 인으로로드 한 다음 메모리에있는 여성을 필터링 할 수 있습니다. 카운트와 동일하게, 그것은 메모리에서 완료됩니다.

대신 IQueryable<Person>을 반환하는 경우 두 질문은 linq-to-entities를 사용하여 평가되며 필터링 및 합계는 데이터베이스에서 수행 할 수 있습니다.

+0

이 질문에 데이터베이스가 실제로 포함되어 있다는 표시는 없습니다. 하지만 그렇다면 비효율에 대해 당신과 동의합니다. –

+0

고마워요! 그래서 대신 IQueryable 을 사용할 것입니다. – Yeonho

관련 문제