2010-07-30 44 views
4

这个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; 
+0

哪个LINQ提供者是那个?它很重要。 LINQ到对象? LINQ到SQL?等等? – 2010-07-30 07:16:50

+0

这是Linq-to-Sql吗? – cjk 2010-07-30 07:16:50

+0

谢谢。这是LINQToObjects,我正在使observablecollection – joey 2010-07-30 07:23:02

回答

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(); 
+0

我不认为你的答案和OP中的LINQ一样 – 2010-07-30 07:38:03

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

回答是好,我是指查看该链接与搜索和改善关系use query linq in search with empty field

这是选择题用于填充或不填充textbox,但此答案是在以下情况下工作的:
您是一个字段填充或两个字段填充或..第7个字段填充。