构建查询以过滤 OR 条件
Building query to filter on OR conditions
我正在尝试构建一个查询,以根据主题过滤新闻。每个新闻项目都可以有几个主题。当我过滤时,我想获取所有具有我过滤的任何主题的新闻项目,但我得到的是具有我选择的所有主题的新闻项目。
我已经尝试了很多不同的解决方案,这就是我现在所拥有的。有什么想法吗?
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();
尝试将 themes
声明为 HasSet
并使用下一个查询:
news.Where(n => n.Post.Themes.Any(t => themes.Contains(t)))
更新:我们这里不需要HashSet。阵列就足够了。感谢@KingKing 和@Dennis
您可以为您的 News
class 编写一个扩展方法。
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;
}
然后在您的代码中调用:
List<News> newsContainingThemes = news.GetNewsByTheme(themes);
根据您的代码,您可以将主题 ID 放入数组并将其传递给 Contains 扩展
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();
我正在尝试构建一个查询,以根据主题过滤新闻。每个新闻项目都可以有几个主题。当我过滤时,我想获取所有具有我过滤的任何主题的新闻项目,但我得到的是具有我选择的所有主题的新闻项目。
我已经尝试了很多不同的解决方案,这就是我现在所拥有的。有什么想法吗?
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();
尝试将 themes
声明为 HasSet
并使用下一个查询:
news.Where(n => n.Post.Themes.Any(t => themes.Contains(t)))
更新:我们这里不需要HashSet。阵列就足够了。感谢@KingKing 和@Dennis
您可以为您的 News
class 编写一个扩展方法。
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;
}
然后在您的代码中调用:
List<News> newsContainingThemes = news.GetNewsByTheme(themes);
根据您的代码,您可以将主题 ID 放入数组并将其传递给 Contains 扩展
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();