C#Linq多字搜索

时间:2018-01-16 15:46:24

标签: c# linq search

我有以下内容,其中searchby是一个字符串

var products = db.Products
   .Where(p => p.Category.Name == category 
          && p.Active == true 
          && (searchby == null || (searchby != null && p.Keywords.Contains(searchby))))
   .Include(p => p.Category)
   .OrderBy(p => p.Description)
   .ThenBy(p => p.Name);

并希望更改它以允许searchby包含多个单词,这些单词会将结果过滤到其中Keywords包含searchby中所有单词的记录。

提前致谢

2 个答案:

答案 0 :(得分:1)

您可以使用其他集合Enumerable.All(不确定您的LINQ提供商是否支持)或!Enumerable.Any

List<string> searchby = ... (empty if there is no filter)
var products = db.Products
   .Where(p => p.Category.Name == category 
          && p.Active == true 
          && !searchby.Any(s => !p.Keywords.Contains(s)))
   .Include(p => p.Category)
   .OrderBy(p => p.Description)
   .ThenBy(p => p.Name);

如果支持,则更具可读性:

&& searchby.All(s => p.Keywords.Contains(s)))

答案 1 :(得分:-1)

这个答案假定,searchby是null或数组。

由于仅包含对1个项目的检查,因此您需要找到一种方法来检查searchby中的所有项目。我想到了Enumerable.All - 方法。以下是相关部分:

searchby.All(searchItem => p.Keywords.Contains(searchItem))

Source