我有以下查询:
List<int> genreIdsInt = genreIds.Split(',').Select(Int32.Parse).ToList();
resultsAfterGenreFilter = (from g in db.games
join gg in db.game_genres on g.id equals gg.game_id
where (gg.genre_id == genreId || genreId == 0)
select g).Distinct();
然而,我没有获得具有特定类型的游戏,而是希望列出genreIdsInt
数组中存在的所有类型的游戏。
因此,如果游戏中没有所有类型都与genreIdsInt
列表中列出的类型相匹配,则它们将不会包含在最终结果中。
game_genres表
游戏桌
示例:如果游戏X属于流派2.如果列表包含2和3,则不会返回该游戏,因为它只属于流派2.它必须属于流派2和3才能返回结果。
我在LINQ with Entity Framework中创建查询。 ASP.NET 4.6 / C#
答案 0 :(得分:2)
典型的方法是使用基于All
的谓词:
var result = db.games.Where(g => genreIdsInt.All(genreId =>
db.game_genres.Any(gg => gg.game_i == g.id && gg.genre_id == genreId)));
IMO转换为更好的SQL的另一种方法是计算匹配:
var result = db.games.Where(g => db.game_genres.Count(gg =>
gg.game_i == g.id && genreIdsInt.Contains(gg.genre_id)) == genreIdsInt.Count);
答案 1 :(得分:1)
List<int> genreIdsInt = genreIds.Split(',').Select(Int32.Parse).ToList();
genreIdsInt.Add(0);
resultsAfterGenreFilter = (from g in db.games
join gg in db.game_genres on g.id equals gg.game_id
where (genreIdsInt.Contains(gg.genre_id))
select g).Distinct();