使用列表

时间:2017-06-14 14:23:16

标签: sql entity-framework linq

我有以下查询:

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表

  • id(int)
  • game_id(int)
  • genre_id(int)

游戏桌

  • id(int)
  • name(string)

示例:如果游戏X属于流派2.如果列表包含2和3,则不会返回该游戏,因为它只属于流派2.它必须属于流派2和3才能返回结果。

我在LINQ with Entity Framework中创建查询。 ASP.NET 4.6 / C#

2 个答案:

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