我有两个清单:
字符串列表:
var keywords = _db.KeyWords.Select(k => k.Word);
Run Code Online (Sandbox Code Playgroud)
和对象列表:
var articles = _db.Articles;
Run Code Online (Sandbox Code Playgroud)
我想要实现的是过滤文章属性包含关键字的文章,例如:
var model = articles.Where(a => a.Title.Contains(keywords) || a.Description.Contains(keywords));
Run Code Online (Sandbox Code Playgroud)
可以在没有 foreach 循环的情况下进行一次查询吗?
一种解决方案是:
List<Article> model = new List<Article>();
foreach (var keyword in keywords)
{
model.AddRange(articles.Where(a => a.Title.Contains(keyword) || a.Description.Contains(keyword)));
}
Run Code Online (Sandbox Code Playgroud)
但是我有 100 个关键字,而且使用 foreach 循环是一个繁重的过程。
换句话说,您只需要从keywords. 因此,在 LINQ 中,它可以通过以下方式完成:
var model = articles
.Where(a => keywords.Any(k => a.Title.Contains(k) || a.Description.Contains(k)))
.ToList();
Run Code Online (Sandbox Code Playgroud)
如果 title 或 description 不包含来自 的任何单词keywords,则不会将其添加到结果列表中。
请注意,与 相比,它不会提高时间复杂度foreach,但可能会提高可读性。
一般来说,任何遍历所有关键字和文章的算法都会进行近似Number of articles * Number of keywords * Average length of article运算,当变量增长时,它会增长得非常快。记在心上。