2012-02-15 3 views
2

내 Linq 쿼리의 시작 부분은 아래와 같습니다.어디 Linq 효율 조항?

where 절에만주의하십시오. Linq는 ToLower()를 한 번만 수행합니까? 또는 searchWords의 모든 요소에 대해 ToLower()를 수행합니까?

var products = from d in xElem.Descendants(fileName) 
         where searchWords.All(t => d.Element(productName).Value.ToLower().Contains(t)) 

답변

5

이 객체에 LINQ입니다 가정하면, 그것은 (그리고 실제로 Element 호출) searchWords의 각 요소에 대해 절대적으로 할 것입니다. 암묵적으로 다른 것을하기 위해 국가를 저장할 수있는 곳이 없습니다. 당신은하지만 쉽게 자신이를 최적화 할 수 있습니다 대소 문자를 구분 비교를 수행하는 다른 방법이 있다는 것을

var products = xElem.Descendants(fileName) 
        .Where(d => { 
         string lowerD = d.Element(productName).Value.ToLower(); 
         return searchWords.All(t => lowerD.Contains(t)); 
        }) 
        ... // rest of query 

참고 :

var products = from d in xElem.Descendants(fileName) 
       let lowerD = d.Element(productName).Value.ToLower() 
       where searchWords.All(t => lowerD.Contains(t)) 

또는 비 쿼리 식에 당신이 문 람다를 사용할 수

더 강력합니다. 예 :

var products = from d in xElem.Descendants(fileName) 
       let v = d.Element(productName).Value 
       where searchWords.All(t => 
        v.IndexOf(t, StringComparison.CurrentCultureIgnoreCase) != -1) 
+0

첫 번째 예를 들면 다음과 같습니다. 모든 선택에 대해 ToLower()를 평가하지 않습니까? –

+0

@NaveedButt : 요소/검색 단어 조합 당 한 번이 아니라 각 요소에 대해 한 번씩 실행됩니다. 각 요소마다 다른 내용을 가질 수 있으므로 각 요소에 대해 한 번 수행해야합니다. –

+0

Jon, 너 놀랍다! 도착한 다음 주에 책을 읽으겠습니다! – RJIGO