130

使用 linq,如何检索其属性列表与另一个列表匹配的项目列表?

以这个简单的例子和​​伪代码为例:

List<Genres> listofGenres = new List<Genre>() { "action", "comedy" });   
var movies = _db.Movies.Where(p => p.Genres.Any() in listofGenres);
4

6 回答 6

229

听起来像你想要的:

var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres).Any());
于 2012-05-19T18:10:54.437 回答
69

您可以为此使用Contains查询:

var movies = _db.Movies.Where(p => p.Genres.Any(x => listOfGenres.Contains(x));
于 2012-05-19T18:13:20.723 回答
6

如果你使用HashSet而不是ListforlistofGenres你可以这样做:

var genres = new HashSet<Genre>() { "action", "comedy" };   
var movies = _db.Movies.Where(p => genres.Overlaps(p.Genres));
于 2018-11-15T01:33:33.533 回答
4

我想这也是可能的吗?

var movies = _db.Movies.TakeWhile(p => p.Genres.Any(x => listOfGenres.Contains(x));

在性能或清晰度方面,“TakeWhile”是否比“Where”差?

于 2013-07-17T08:56:30.793 回答
2

如果Genre是一个实体并且有它自己的属性,比如Title,使用下面的代码:

var listofGenresName = new List<string> { "action", "comedy" };
var movies = _db.Movies.Where(p => p.Genres.Any(x => listofGenresName.Any(g=> g == x.Title)));
于 2021-12-04T11:45:26.743 回答
1

或者像这样

class Movie
{
  public string FilmName { get; set; }
  public string Genre { get; set; }
}

...

var listofGenres = new List<string> { "action", "comedy" };

var Movies = new List<Movie> {new Movie {Genre="action", FilmName="Film1"},
                new Movie {Genre="comedy", FilmName="Film2"},
                new Movie {Genre="comedy", FilmName="Film3"},
                new Movie {Genre="tragedy", FilmName="Film4"}};

var movies = Movies.Join(listofGenres, x => x.Genre, y => y, (x, y) => x).ToList();
于 2014-08-28T12:22:07.133 回答