C# LINQ-查询多个属性以进行潜在匹配
我有以下内容,查询集合的属性以查找传递给该方法的查询中包含的任何潜在匹配项,该查询可能包含空格:C# LINQ-查询多个属性以进行潜在匹配,c#,linq,C#,Linq,我有以下内容,查询集合的属性以查找传递给该方法的查询中包含的任何潜在匹配项,该查询可能包含空格: var query = request.Query.ToLower().Trim(); if (query.Contains(" ")) { var queryArr = query.Split(' '); customers = queryArr.Aggregate(customers, FindCustomers); } else { customers = FindCu
var query = request.Query.ToLower().Trim();
if (query.Contains(" "))
{
var queryArr = query.Split(' ');
customers = queryArr.Aggregate(customers, FindCustomers);
}
else
{
customers = FindCustomers(customers, query);
}
FindCustomers如下所示:
private static IQueryable<Customer> FindCustomers(
IQueryable<Customer> customers, string query)
{
return customers.Where(
x =>
x.ACCOUNTNUM.ToLower().StartsWith(query) ||
x.NAME.ToLower().Contains(query) ||
x.ZIPCODE.ToLower().Contains(query) ||
x.CITY.ToLower().Contains(query));
}
了解问题所在的一种方法是查看生成的查询。
问题是你会有很多东西,有很多地方和理由:
SELECT ...
FROM ...
WHERE LOWER(ACCOUNTNUM) LIKE "query%"
OR LOWER(NAME) LIKE "%query%"
OR ...
OR LOWER(ACCOUNTNUM) LIKE "query2%"
OR LOWER(NAME) LIKE "%query2%"
...
它会很慢,因为文本搜索很慢
优化的一种方法是使用大写而不是小写,因为大多数DBM都是针对大写进行优化的:
var query = request.Query.ToUpper().Trim();
return customers.Where(
x =>
x.ACCOUNTNUM.ToUpper().StartsWith(query) ||
x.NAME.ToUpper().Contains(query) ||
x.ZIPCODE.ToUpper().Contains(query) ||
x.CITY.ToUpper().Contains(query));
如果使用空格搜索,它会返回正确的结果,或者只返回最后一个参数?它确实会返回正确的结果,正如我所说的,使用空格搜索时似乎有点滞后。它只是Linq到对象,或者是在后台访问数据库?在此之前访问数据库。。我使用的是EFL。您是要直接查询数据库,还是在对其应用筛选器之前加载内存中的所有对象?
var query = request.Query.ToUpper().Trim();
return customers.Where(
x =>
x.ACCOUNTNUM.ToUpper().StartsWith(query) ||
x.NAME.ToUpper().Contains(query) ||
x.ZIPCODE.ToUpper().Contains(query) ||
x.CITY.ToUpper().Contains(query));