2013-09-27 88 views
1
許多數據庫查詢

我在許多一對多的關係許多與LINQ

以下數據庫表
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

回答

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 

對於一個普通的一個,可以延長comportement,如果我們假定你有一個標籤列表:

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