2011-09-27 191 views
2

我试图创造一个用户有一个单一的“谷歌”式的查询框,其搜索所有地址字段IE地址线1,城镇,城市,邮编等简单的地址屏幕像Linq的跨多个领域搜索

我正在使用.net和EF与SQL数据库。我试过

IEnumerable<T> results = from x in dbSet 
         where (x.AddressLine1 + x.AddressLine2 + 
           x.AddressLine3 + x.Town + x.City + 
           x.County + x.Postcode).Contains(Query) 
         select x; 

这时候就应该不匹配任何结果。如果我将其更改为

IEnumerable<T> results = from x in dbSet 
         where x.AddressLine1.Contains(Query) 
         select x; 

它匹配并返回结果,但显然它不在所有字段中搜索。第一个问题,为什么我的第一个例子不工作,其次是这是实施这个的最好方法,还是会在压力下挣扎。

+0

所有的'AddressLine1','AddressLine2',''''''类型''''''''''''''''''''' –

回答

3

试试这个会发生什么:

IEnumerable<T> results = from x in dbSet 
         where x.AddressLine1.Contains(Query) || 
         x.AddressLine2.Contains(Query) || 
         x.AddressLine3.Contains(Query) || 
         x.Town.Contains(Query) || 
         x.City.Contains(Query) || 
         x.County.Contains(Query) || 
         x.Postcode 
         select x; 

对于更复杂的搜索使用LINQ,我用LinqKit

1

如果你使用这个

IEnumerable<T> results = from x in dbSet 
where x.AddressLine1.ToString().Contains(Query) || 
    x.AddressLine2.ToString().Contains(Query) || 
    x.AddressLine3.ToString().Contains(Query) || 
    x.Town.ToString().Contains.(Query)|| 
    x.City.ToString().Contains.(Query) || 
    x.Postcode.ToString().Contains(Query) 
select x; 
2

您当前的做法需要进行全表扫描每行有一些子字符串匹配操作 - 我无法想象这是在大型表上执行的。你真正应该做的是使用SQL全文。在EF中没有对此的本机支持,但可以使用存储过程或存储查询。