我有一个电影列表
List<Movie> MovieList
我有一个选定类别的列表
List<string> SelCat
并说我想从电影列表中选择它匹配2个类别,如下面的SQL语句:
SELECT * FROM MovieList WHERE MovieList.Category = 'Action' AND MovieList.Category = 'Drama'
我可以像linq那样接近linq:
var q = (from b in MovieList where b.Categories.Any(p=> SelCat.Contains(p)) select b);
但它的行为类似于OR查询,而不是AND。我希望它能够选择所有具有动作和戏剧类别的电影。
BTW: Movie.Categories是一个字符串列表。 AND Movie.Categories必须包含SelCat中的项目。
如何使用Linq to Objects实现此目的?
答案 0 :(得分:9)
var q = from m in MovieList where SelCat.All(c => m.Categories.Contains(c))
非常接近你用英语描述问题的内容:
选择电影类别包含SelCat
中所有类别的电影。
答案 1 :(得分:1)
如果您希望电影与所有有趣的类别相匹配(即SelCat
中的所有类别都出现在movie.Categories
中),您可以这样做:
MovieList.Where(movie => !SelCat.Except(movie.Categories).Any());
另一方面,如果您希望电影与所选类别的至少 2匹配:
MovieList.Where(movie => SelCat.Intersect(movie.Categories).Count() >= 2);
答案 2 :(得分:1)
var SelectedCategories = List<string>();//list of selected categories
from movie in MovieList
join selCat in Categories.Where(SelectedCategories.Contains(selCat.Category)
on movie.category equals selCat.category
select movie
答案 3 :(得分:0)
只做一个交叉,然后是除外。 它很有效,对不起,我不得不用vb写出来。
Dim categories As New List(Of String)
Dim selected As New List(Of String)
categories.Add("ali")
categories.Add("ali2")
categories.Add("ali3")
categories.Add("ali4")
selected.Add("ali2")
selected.Add("ali4")
Dim common = categories.Intersect(selected)
If common.Except(selected).Count = 0 Then
'true
Else
'false
End If
答案 4 :(得分:0)
有点复杂:
var moviesInSelCat = MovieList.Where(m => SelCat.All(sc => m.Category.Any(c => c == sc)));
答案 5 :(得分:0)
var result = from movie in movieList
where selCat.All(selectedCategory => movie.Categories.Contains(selectedCategory))
select movie;
请记住.All()
和.Any()
答案 6 :(得分:0)
试试这个
var matches = MovieList.Where(m => SelCat.Except(
m.Categories.Intersect(SelCat)).Count() == 0);