Linq效率中的哪个子句?

RJI*_*IGO 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))
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

假设这是LINQ to Objects,它绝对会Element在每个元素上执行它(实际上是调用)searchWords.没有地方可以真正存储状态来隐藏其他任何事情.您可以自己轻松优化:

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

或者在非查询表达式中,您可以使用语句lambda:

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

请注意,还有其他方法可以执行不区分大小写的比较,这些方法更加健壮.例如:

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