如何使用LINQ查询实现同时匹配FirstName与LastName的多关键词搜索
解决方案
实现思路
先将输入的搜索文本拆分为独立单词,统一转小写后去重,再分别判断FirstName、LastName列是否各至少包含一个拆分后的搜索词即可。
代码实现
第一步:预处理搜索文本
// 拆分搜索文本为单词、转小写、过滤空值、去重 var searchWords = SearchText.ToLower() .Split(' ', StringSplitOptions.RemoveEmptyEntries) .Distinct() .ToList();
第二步:修改LINQ查询语句
getQuery = _uow.GetRepository<EntityModel.UserOrganization>() .GetAll() .Where(x => // FirstName列至少匹配一个搜索词 searchWords.Any(word => x.User.FirstName.ToLower().Contains(word)) // LastName列至少匹配一个搜索词 && searchWords.Any(word => x.User.LastName.ToLower().Contains(word)) );
注意事项
- 上述写法支持EF/EF Core等主流ORM框架转SQL执行,不会触发客户端评估,性能有保障。
- 如果你需要严格匹配完整单词(避免搜索
ash命中Ashok这类子串匹配的情况),可以改用拆分字段后取交集的写法,该写法需要你的ORM支持Split方法的SQL转换:// 完整单词匹配版本 getQuery = _uow.GetRepository<EntityModel.UserOrganization>() .GetAll() .Where(x => x.User.FirstName.ToLower().Split(' ', StringSplitOptions.RemoveEmptyEntries).Intersect(searchWords).Any() && x.User.LastName.ToLower().Split(' ', StringSplitOptions.RemoveEmptyEntries).Intersect(searchWords).Any() );
内容的提问来源于stack exchange,提问作者user1528398
相关产品推荐
相关产品推荐

