【问题标题】:Many to Many database query with LINQ使用 LINQ 进行多对多数据库查询
【发布时间】:2013-09-27 03:31:51
【问题描述】:

我有以下多对多关系的数据库表

Article
- Id

ArticleTag
- ArticleId
- TagId

Tag
- Id

*所有ID都是int

我无法弄清楚如何编写 LINQ to SQL 查询,该查询将返回与属于同一文章的多个标签匹配的文章列表。

示例: 返回带有标签 2 和 5 的文章

Article 1 has tags 2,3,5
Article 2 has tags 2,3,6,7
Article 3 has tags 2,5,9
Article 4 has tags 1,2,9,12

结果只会是第 1 条和第 3 条

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    此查询返回具有标签 2 和 5 的文章 ID:

    ctx.ArticleTags.Where(at => at.TagId == 2 || at.TagId == 5)
               .GroupBy(at => at.ArticleId)
               .Where(group => group.Count() == 2)
               .Select(group => group.Key);
    

    生成的 SQL 将是:

    SELECT ArticleId
    FROM ArticleTag
    WHERE TagId = 2 OR TagId = 5
    GROUP BY ArticleId
    HAVING Count(1) = 2
    

    如果我们假设您有一个标签列表,您可以扩展该功能:

    var tagIds = new List<int>(){ 2, 5 };
    ctx.ArticleTags.Where(at => tagIds.Contains(at.TagId))
               .GroupBy(at => at.ArticleId)
               .Where(group => group.Count() == tagIds.Count)
               .Select(group => group.Key);
    

    请注意,在这种情况下,生成的 SQL 将使用 IN 而不是列表或 OR

    SELECT ArticleId
    FROM ArticleTag
    WHERE TagId in (2, 5)
    GROUP BY ArticleId
    HAVING Count(1) = 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多