繁体   English   中英

从PredicateBuilder中剥离字符以提高搜索精度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM