使用 LINQ 进行多对多数据库查询
本文关键字:多数据 数据库 查询 LINQ 使用 | 更新日期: 2023-09-27 18:32:55
我在多对多关系中有以下数据库表
Article
- Id
ArticleTag
- ArticleId
- TagId
Tag
- Id
*所有 ID 均为整数
我在弄清楚如何编写 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条
此查询返回具有标记 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