LinqToSql查询跨越多对多关系?

时间:2009-10-30 15:43:19

标签: c# linq linq-to-sql

假设我有以下架构

Content(Id, ....)
TagContent(TagId, ContentId)
Tag(TagId, Name)

假设我想选择所有标记为“test”的内容记录。

在SQL中我会写:

select Content.Id 
from Content 
       join TagContent as TC on (TC.ContentId = Content.Id)
       Join Tag on (TC.TagId = Tag.Id)
where Tag.Name = 'Test'

如果您只有Table可用,您能否建议如何在Linq中编写类似的查询? (我想创建一个扩展方法Content.ByTag('tag') - > IQueryable)

我只设法创建一个使用sql exists语句而不是join的查询。 这意味着查询效率极低。

我目前效率低下的解决方案如下:

DataContext.Contents.Where(c => c.TagContents.Any(tc => tc.Tag.Name == "Test"))

注意: 因为我想在DataContext.Contents上创建扩展方法,所以我将无法访问其他表,即DataContext.Tag和DataContext.ContentTag。

1 个答案:

答案 0 :(得分:0)

这样的事可能

var contentIds = from c in Content
                     join tc in TagContent on c.Id equals tc.ContentId
                     join t in Tag on tc.TagId equals t.Id
                     where t.Name == "Test"
                     select new 
                     {
                        ContentId = c.Id
                     };