2011-08-26 2 views
0

또한 where 절의 순서가 중요합니까?이 두 linq 쿼리간에 성능 차이가 있습니까? 동일하거나 본질적으로 다릅니 까?

from x in A.where(x=>CriteriaA(x)) 
    from y in B where(y=>CriteriaB(y)) 
    where CriteriaC(x,y) 


    from x in A 
    from y in B 
    where(x=>CriteriaA(x)) 
    where(y=>CriteriaB(y)) 
    where CriteriaC(x,y) 

    from x in A 
    from y in B 
    where(y=>CriteriaB(y)) 
    where(x=>CriteriaA(x)) 
    where CriteriaC(x,y) 

업데이트 : 모든 객체

에 IEnumerable을 < 있습니다>와 Linq에

사용 존 소총의 시나리오 : A는 B는 100 개 항목이 CriteriaA 일치 25있는 100 개 항목을 가지고 50있는의 일치 CriteriaB

첫 번째 첫 번째 방법은 CriteriaA으로 100 건, CriteriaB으로 2500 건을 호출하고 CriteriaC으로 1250 건을 호출합니다.

두 번째 방법에서는 CriteriaA에 10000 번, CriteriaB에 2500 번, CriteriaC에 1250 번을 호출합니다.

세 번째 방법에서는 CriteriaB에 10000 건의 전화를 걸고 CriteriaA에 5000 건의 전화를 걸고 CriteriaC에 1250 건의 전화를 겁니다.

맞습니까?

+3

아마도 나는 성능이 있다는 것을 알기는하지만 실제로이 것보다 더 많은 것이 있기를기도합니다. – BoltClock

답변

5

이것은 부분적으로 이것이 LINQ to Objects, LINQ to SQL 등등에 달려 있습니다. LINQ to Object라고 가정합시다.

이 시나리오를 상상해 :

  • A 그런 다음 첫 번째 시나리오에 CriteriaB

일치 50있는 100 개 항목을 가지고 CriteriaA

  • B 일치 25있는 100 개 항목을 가지고, CriteriaA에 대한 100 건의 전화, CriteriaB에 대한 2500 건의 전화 및 CriteriaC에 대한 1250 건의 전화가있을 것입니다.

    두 번째 시나리오에서는 CriteriaA에 대한 10,000 건의 호출, CriteriaB에 대한 2500 건의 호출 및 CriteriaC에 대한 1250 건의 호출이있게됩니다.

    당신이 "실현"경우

    이 같은 일 Where 호출의 결과는 :
    var resultsB = B.Where(y => CriteriaB(y)).ToList(); 
    
    from x in A.Where(x => CriteriaA(x)).ToList() 
    from y in resultsB 
    where CriteriaC(x,y) 
    

    그런 다음 CriteriaA 100 전화, CriteriaB 100 개 통화 및 CriteriaC에 동일한 1250 호출이있을 것이다. 분명히 그 결과를 캐쉬해야하므로 더 많은 메모리가 필요합니다.

  • 1

    적은 데이터를 가져 오기 때문에 처음에는 더 빠를 것이라고 기대합니다.

    그러나 데이터 세트에 따라 달라질 수 있으며 약 IEnumerable<> 또는 IQueryable<>인지 여부는 중요합니다.

    정말로 알고 싶다면 : 측정.

    관련 문제