构建查询以过滤OR条件

时间:2015-10-20 09:50:13

标签: c# entity-framework linq lambda iqueryable

我正在尝试构建一个基于主题过滤新闻的查询。每个新闻都可以有几个主题。当我过滤时,我希望获得具有我过滤的任何主题的每个新闻项目,但我得到的是具有我选择的所有主题的新闻项目。

我尝试了很多不同的解决方案,这就是我现在所拥有的。有什么想法吗?

IQueryable<News> news = context.News;

if (themes.Any())
{
  foreach (var t in themes)
  {
    news = news.Where(n => n.Post.Themes.Count > 0).Where(n => n.Post.Themes.Select(th => th.Id).Contains(t.Id)); 
  }
}
return news.ToList();

3 个答案:

答案 0 :(得分:1)

尝试将themes声明为HasSet并使用下一个查询:

news.Where(n => n.Post.Themes.Any(t => themes.Contains(t)))

更新:我们这里不需要HashSet。数组足够好了。谢谢@KingKing和@Dennis

答案 1 :(得分:1)

根据您的代码,您可以将主题ID放入数组并将其传递给包含扩展

IQueryable<News> news = context.News;
var themesIds = themes.Select(t=>t.Id).ToArray();

news = news.Where(n =>  n.Post.Themes.Any(t=>themesIds.Contains(t.Id))); 

return news.ToList();

答案 2 :(得分:0)

您可以为void show_digit(int x) { if (x < 10) { printf("%d ", x); return; } else { show_digit(x/10); } int the_digit = x % 10; printf("%d ", the_digit); return; } 课程编写扩展方法。

News

然后在你的代码中调用:

public static class NewsExtensions {

public static List<News> GetNewsByTheme(this List<News> news, List<Theme> themes) {
    List<News> result = new List<News>();
    foreach(var theme in themes) {
        foreach(var newsItem in news) {
            ...some logic here
            result.Add(newsItem);
        }
    }
    return result;
}