【问题标题】:Get results for sub query with matching values from a List从列表中获取具有匹配值的子查询的结果
【发布时间】:2017-06-14 14:23:16
【问题描述】:

我有以下疑问:

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)
  • 名称(字符串)

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

我正在使用实体框架在 LINQ 中创建查询。 ASP.NET 4.6 / C#

【问题讨论】:

    标签: sql entity-framework linq


    【解决方案1】:

    典型的方法是使用基于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);
    

    【讨论】:

    • 成功了,谢谢。我只想尝试了解它在实践中的工作原理,但再次感谢您的帮助 Ivan。
    【解决方案2】:
    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();
    

    【讨论】:

    • 它列出了属于这两种类型的游戏。它应该显示为所有这些类型列出的游戏,而不仅仅是一个子集。
    猜你喜欢
    • 2021-05-16
    • 2021-06-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多