2

我有一个文本框,它将自由文本作为搜索的输入,并且我有一个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
4

2 回答 2

1

我强烈建议您使用两个查询来完成!

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

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

但是你真的应该用两个不同的查询来完成它。

于 2012-04-15T00:17:25.177 回答
0

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

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,即使为此我们不希望它这样做。

请注意,这两种解决方案都假定单词总是由空格分隔,这通常不是真的。您的用户可以在单词之间键入制表符,使用引号来分隔单词组(例如“New York”),等等。

于 2012-04-15T00:19:06.367 回答