2012-02-15 63 views
2

我的Linq查詢的開始如下。Linq效率中的Where子句?

只關注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 = from d in xElem.Descendants(fileName) 
       let lowerD = d.Element(productName).Value.ToLower() 
       where searchWords.All(t => lowerD.Contains(t)) 

或者在非查詢表達式,你可以使用一個語句的λ:

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 v = d.Element(productName).Value 
       where searchWords.All(t => 
        v.IndexOf(t, StringComparison.CurrentCultureIgnoreCase) != -1) 
+0

在您的第一個示例中。每次選擇都不會評估ToLower()嗎? – 2012-02-15 07:32:32

+0

@NaveedButt:它會爲每個元素執行一次,而不是每個元素/ searchWord組合執行一次。它必須爲每個元素執行一次,因爲每個元素都可以有不同的內容! – 2012-02-15 07:35:35

+0

喬恩,你真了不起!我將在下週到達時閱讀你的書! – RJIGO 2012-02-15 07:41:12