![](/img/trans.png)
[英]PredicateBuilder stripping brackets, breaking nested AND's combined with OR
[英]Stripping characters from PredicateBuilder to improve search accuracy
我有一种方法,可以将搜索词传递到该方法中,以从数据库构建自定义Linq查询。 这确实很好用,但有一个小问题,当我搜索电话号码时,它必须与数据库值完全相同,即
存储在数据库中的典型电话号码格式:1234 567 8910(1234)567 8910 1234-567-8910
我想搜索12345678910并获得与搜索1234 567 8910相同的结果。我尝试如下解决此问题,但无济于事:
public Expression<Func<Customer, bool>> ContainsInDescription(
params string[] keywords)
{
var predicate = PredicateBuilder.False<Customer>();
foreach (string keyword in keywords)
{
string temp = keyword;
predicate = predicate.Or(p => p.Name.Contains(temp));
predicate = predicate.Or(p => p.Company.Contains(temp));
// This works but must same be as stored in database
predicate = predicate.Or(p => p.PhoneHome.Contains(temp));
predicate = predicate.Or(p => p.PhoneMobile.Contains(temp));
predicate = predicate.Or(p => p.PhoneWork.Contains(temp));
// My attempt to strip out the chacters from the search
predicate = predicate.Or(p => p.PhoneHome.ToString().Replace(" ", "").Replace("-", "").Contains(temp.ToString().Replace(" ", "").Replace("-", "")));
predicate = predicate.Or(p => p.PhoneMobile.ToString().Replace(" ", "").Replace("-", "").Contains(temp.ToString().Replace(" ", "").Replace("-", "")));
//predicate = predicate.Or(p => p.PhoneWork.ToString().Replace(" ", "").Replace("-", "").Contains(temp.ToString().Replace(" ", "").Replace("-", "")));
predicate = predicate.Or(p => p.Email.Contains(temp));
predicate = predicate.Or(p => p.Address.AddressLine1.Contains(temp));
predicate = predicate.Or(p => p.Address.AddressLine2.Contains(temp));
predicate = predicate.Or(p => p.Address.City.Contains(temp));
predicate = predicate.Or(p => p.Address.County.Contains(temp));
predicate = predicate.Or(p => p.Address.PostalCode.Contains(temp));
predicate = predicate.Or(p => p.Address.Country.Contains(temp));
}
return predicate;
}
我已添加此代码以显示如何使用上述方法(以防万一,我确定有更好的方法!)。
var SearchVals = ContainsInDescription(keywords);
using (DataClassesDataContext data = new DataClassesDataContext(cDbConnection.GetConnectionString()))
{
var query = (from customer in data.Customers.Where(SearchVals)
where customer.Deleted == false
orderby customer.Name ascending
select new
{
CustomerID = customer.CustomerID.ToString(),
Name = customer.Name,
Company = customer.Company,
Home = customer.PhoneHome,
Mobile = customer.PhoneMobile,
Work = customer.PhoneWork,
Email = customer.Email,
Address1 = customer.Address.AddressLine1,
Address2 = customer.Address.AddressLine2,
City = customer.Address.City,
County = customer.Address.County,
Postcode = customer.Address.PostalCode,
Country = customer.Address.Country
}).Skip(totalToDisplay * page).Take(totalToDisplay);
我认为您需要替换“(”和“)”,然后在末尾添加Trim()。 通过使用==而不是使用Contains方法进行比较。
predicate = predicate.Or(p => p.PhoneHome.ToString().Replace(" ", "").Replace("-", "").Replace("(","").Replace(")","").Trim() == temp.ToString().Replace(" ", "").Replace("-", "").Replace("(","").Replace(")","").Trim());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.