我的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))
答案 0 :(得分: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))
或者在非查询表达式中,您可以使用语句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
请注意,还有其他方法可以执行不区分大小写的比较,这些比较更加强大。例如:
var products = from d in xElem.Descendants(fileName)
let v = d.Element(productName).Value
where searchWords.All(t =>
v.IndexOf(t, StringComparison.CurrentCultureIgnoreCase) != -1)