我正在尝试创建一个简单的地址屏幕,其中用户有一个“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;
匹配并返回结果,但显然不会搜索所有字段。第一个问题为什么我的第一个例子不起作用,第二个问题是这是实现这个的最好方法,还是在压力下挣扎。
答案 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;