如何优化这个用于搜索的LINQ查询?

4

我能够改进这个LINQ查询吗?

var filter = from Dep in deptlist
where (Dep.DepNm.StartsWith(txt1.Text.ToLower()) 
  || Dep.DepNm.StartsWith(txt1.Text.ToUpper())
  ||Dep.DepNm.Contains(txt1.Text)) 
select Dep;

这是哪个LINQ提供程序?这很重要。是LINQ-to-Objects?LINQ-to-SQL?等等? - Marc Gravell
谢谢。这是LINQToObjects,我正在创建ObservableCollection。 - joey
4个回答

3

目前,您对每个项目执行.Text.Text.ToUpper().Text.ToLower()的操作针对固定值ToUpper()等相对较昂贵);您可以将其提取出来:

string text = txt1.Text, upper = text.ToUpper(), lower = text.ToLower();
var filter = from Dep in deptlist
             where Dep.DepNm.StartsWith(lower) || Dep.DepNm.StartsWith(upper)
                   || Dep.DepNm.Contains(text)) 
             select Dep;

我这里假设.DepNm是非常便宜的。如果这个属性实际上是一个昂贵的查询,你可以使用let来最小化调用:

var filter = from Dep in deptlist
             let name = Dep.DepNm
             where name.StartsWith(lower) || name.StartsWith(upper)
                   || name.Contains(text)) 
             select Dep;

1
var filter = from Dep in deptlist
where Dep.where(d => d.DepNm.ToUpper().Conatins(txt1.Text.ToUpper())) 
select Dep;

如果您的解决方案可以实现,尝试添加lambda表达式。这样至少可以节省一行代码 :)

编辑: 忘掉我之前说的话,这个短得多:

var filter = deptlist.where(d => d.DepNm.ToUpper().Conatins(txt1.Text.ToUpper())).ToList();

我认为你的答案与OP问题中的LINQ不同。 - Matt Ellen

0

我认为这更快,因为条件较少。

var filter = from Dep in deptlist
where (Dep.DepNm.StartsWith(txt1.Text, StringComparison.OrdinalIgnoreCase))
||Dep.where(d => d.DepNm.ToUpper().Contains(txt1.Text.ToUpper()))
select Dep;

0

答案很好,我推荐查看与搜索和改进有关的链接使用查询 linq 在搜索中使用空字段

这是填写或不填写文本框的多项选择,但当:
您填写一个字段或两个字段或..第七个字段时,此答案有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接