Linq,其中实体属性包含另一个列表

Nik*_*ili 4 c# linq

我有两个清单:

字符串列表:

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 循环是一个繁重的过程。

Yel*_*yev 5

换句话说,您只需要从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运算,当变量增长时,它会增长得非常快。记在心上。