Answers:
听起来像您想要的:
var movies = _db.Movies.Where(p => p.Genres.Intersect(listOfGenres).Any());
Contains
反复使用最终会在时间上成为O(x * y)操作,但在空间上为O(1),其中x是第一个集合的大小,y是第二个集合的大小。使用的时间Intersect
为O(x + y),但空间的为O(y)-它从第二个集合构造一个哈希集,这使它可以快速检查第一个集合中是否包含任何项。见codeblog.jonskeet.uk/2010/12/30/...的细节
如果您使用HashSet
的,而不是List
针对listofGenres
你可以这样做:
var genres = new HashSet<Genre>() { "action", "comedy" };
var movies = _db.Movies.Where(p => genres.Overlaps(p.Genres));
或者像这样
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();
.StartWith, .EndsWith, .Contains
从这里尝试了它的工作原理,但是可以使用您的查询做什么