gpt4 book ai didi

c# - LINQ - 查询多个属性以进行潜在匹配

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:39 30 4
gpt4 key购买 nike

我有以下内容,它查询我的集合中的属性以查找传递给该方法的查询中包含的任何潜在匹配项,该查询可以包含空格:

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));
}

这个问题是当用空格搜索时(例如:CUS0001 London TestAccount),它似乎有点滞后所以想知道这是否是查询多个属性的最有效方法具有多个单词的对象

编辑

在此之前访问数据库,我使用的是EF:

var customers = DbEntities.Customers.OrderBy(x => x.ACCOUNTNUM).AsQueryable();

最佳答案

了解问题出在哪里的一种方法是查看生成的查询。
问题是你会得到一些有很多 wheres 和 ors 的东西:

SELECT ...
FROM ...
WHERE LOWER(ACCOUNTNUM) LIKE "query%"
OR LOWER(NAME) LIKE "%query%"
OR ...
OR LOWER(ACCOUNTNUM) LIKE "query2%"
OR LOWER(NAME) LIKE "%query2%"
...

而且它会很慢,因为文本搜索很慢。

优化的一种方法是使用大写而不是小写,因为大多数 DBMS 都针对大写比较进行了优化:

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));

关于c# - LINQ - 查询多个属性以进行潜在匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20679540/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com