实现 Linq 搜索查询以获取 n 个关键字和 AND/OR 选项

本文关键字:关键字 AND 选项 OR 搜索 Linq 查询 获取 实现 | 更新日期: 2023-09-27 18:31:04

我有一个文本框,它将自由文本作为搜索的输入,并且我有一个LINQ查询,我想通过这种类型的搜索进行扩展。

输入可能类似于 "big blue car",这应该会导致搜索包含所有这些单词的标题的查询。

还有一个选项可以切换到"任何单词"而不是"所有单词"。

将其添加到我的LINQ查询的最佳/最简单的方法是什么?

查询现在看起来像

from b in books
where b.InStore == true && b.Price > 10 && title.Contains()...at this point i want to add the text search. 
select b

实现 Linq 搜索查询以获取 n 个关键字和 AND/OR 选项

我强烈建议你用两个查询来做!

但是看看这个,是不是很酷?

var searchAll = true;
var words = List<string>{"big", "blue", "car"};
from b in books
where (...) (searchAll && words.All(x => title.contains(x))) ||
            (!searchAll && words.Any(x => title.Contains(x)))
select b

但是您确实应该使用两个不同的查询来做到这一点。

我会首先将查询和标题拆分为单词,然后检查包含。 粗剪是

string[] queryParts = query.Split(' ');
books.Where(b => b.InStore)
    .Where(b => b.Price > 10)
    .Where(b => queryParts.Any(part => b.Title.Split(' ').Contains(part)))

对于任何查询,以及

string[] queryParts = query.Split(' ');
books.Where(b => b.InStore)
    .Where(b => b.Price > 10)
    .Where(b => queryParts.All(part => b.Title.Split(' ').Contains(part)))

对于所有查询。

我们必须将标题拆分为单词,因为默认的 String.Contains 方法查找任何子字符串匹配项,这意味着

"ABC DEF".Contains("A")

返回true,即使出于这个目的我们不希望它这样做。

请注意,这两种解决方案都假定单词始终由空格分隔,这通常不正确。 您的用户可以在单词之间键入制表符,使用引号分隔单词组(例如"纽约"),等等。