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