如何改进此LINQ查询以进行搜索

时间:2010-07-30 07:13:11

标签: c# linq

我可以改进此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;

4 个答案:

答案 0 :(得分: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 :(得分: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();

答案 2 :(得分: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;

答案 3 :(得分:0)

答案很好,我建议查看此链接与搜索和改进的关系use query linq in search with empty field

这是填充或不填充textbox的多种选择,但这个答案适用于: 你是一个田间填充或两个现场填充或..第7场填充。