C# 使用LINQ进行多对多数据库查询

C# 使用LINQ进行多对多数据库查询,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有以下多对多关系中的数据库表 Article - Id ArticleTag - ArticleId - TagId Tag - Id *所有ID都是int 我很难理解如何编写一个LINQtoSQL查询,该查询将返回与属于同一篇文章的多个标记匹配的文章列表 例如: 返回标签为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

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

Article
- Id

ArticleTag
- ArticleId
- TagId

Tag
- Id
*所有ID都是int

我很难理解如何编写一个LINQtoSQL查询,该查询将返回与属于同一篇文章的多个标记匹配的文章列表

例如: 返回标签为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条

此查询返回的文章ID与标记2和5完全相同:

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);

此查询返回正好具有标记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);