其中 list 包含任何 in list

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

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

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

听起来像是你想要的:

var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres).Any());

您可以使用 Contains查询:

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

我想这也可能是这样的吧?

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

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

或者像这样

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();

如果你在 listofGenres使用 HashSet而不是 List,你可以这样做:

var genres = new HashSet<Genre>() { "action", "comedy" };
var movies = _db.Movies.Where(p => genres.Overlaps(p.Genres));

如果 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)));