Linq喜欢在多个领域进行搜索

时间:2011-09-27 13:12:58

标签: .net sql linq entity-framework

我正在尝试创建一个简单的地址屏幕,其中用户有一个“google”样式查询框,可以搜索所有地址字段,即地址第1行,城镇,城市,邮政编码等。

我正在使用.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;

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

3 个答案:

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

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

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