C# 连接是否适合在LINQ到SQL中实现此类功能?

C# 连接是否适合在LINQ到SQL中实现此类功能?,c#,sql,linq,linq-to-sql,join,C#,Sql,Linq,Linq To Sql,Join,我正在编写一个ASP.NETMVC站点,在这里我使用LINQtoSQL访问我的SQLServer数据库。在我的数据库中,我有以下表格: 帖子: PostID-int、PK、identity 文本-nvarchar(最大值) PublishDate-日期时间 等等 PostTags: PostTagID-int、PK、identity PostID-FK到PK到Posts表 TagID-FK到PK到标记表 标签: TagID-int、PK、identity 标记名-varchar(100

我正在编写一个ASP.NETMVC站点,在这里我使用LINQtoSQL访问我的SQLServer数据库。在我的数据库中,我有以下表格:

帖子

  • PostID-int、PK、identity
  • 文本-nvarchar(最大值)
  • PublishDate-日期时间
  • 等等
PostTags

  • PostTagID-int、PK、identity
  • PostID-FK到PK到Posts表
  • TagID-FK到PK到标记表
标签

  • TagID-int、PK、identity
  • 标记名-varchar(100)
每个帖子必须至少有一个标签,因此它是一个单对多关系

我正在尝试构建一个标签搜索功能。我想接受一个标记作为参数返回具有该标记的前25篇文章,按PublishDate降序排列。以下是我当前的LINQ到SQL代码:

    var query = (from post in db.Posts
                join posttag in db.PostTags
                on post.PostID equals posttag.PostID
                where posttag.Tag.TagName==tag
                select post).OrderByDescending(p=>p.DateOfPublish).Take(25);
然而,我认为我的代码是错误的,因为它似乎不尊重POST和标记之间的单对多关系


如何改进代码?提前谢谢

不要简单地说“它不起作用”,你应该发布你的预期结果和你实际得到的。@Adam我还没有测试代码,但我很确定它不会起作用,因为PostTags中可能有多条记录具有相同的PostID。我的钱在数据上。您能给我们一些示例记录并说明返回了哪些记录(如果有)吗?您描述的是一种多对多关系,因为一篇文章可以与多个标记相关,反之亦然——一个标记可以与多篇文章相关。@OMGPonies true,posts to tags是多对多的;然而,对PostTags的发布是单对多的,不是吗?与其简单地说“它不起作用”,你应该发布你的预期结果和你实际得到的。@Adam我还没有测试代码,但我很确定它不会起作用,因为PostTags中可能有多条记录具有相同的PostID。我的钱在数据上。您能给我们一些示例记录并说明返回了哪些记录(如果有)吗?您描述的是一种多对多关系,因为一篇文章可以与多个标记相关,反之亦然——一个标记可以与多篇文章相关。@OMGPonies true,posts to tags是多对多的;然而,PostTags的帖子是一对多的,对吧?太棒了,谢谢,现在就去试试吧。顺便说一下,VisualStudio抱怨“on…”行应该是“on posttag.TagID等于tags.TagID”。@Maxim Zaslavsky真的吗?对我来说,这是个大新闻。谢谢(已修复)。我看不出这怎么可能比原始代码更好,除非
PostTags
可以有重复记录(在这种情况下,您的设计有问题)。太棒了,谢谢,现在就来试试。顺便说一下,VisualStudio抱怨“on…”行应该是“on posttag.TagID等于tags.TagID”。@Maxim Zaslavsky真的吗?对我来说,这是个大新闻。谢谢(已修复)。我看不出这怎么可能比原始代码更好,除非
PostTags
可以有重复记录(在这种情况下,您的设计有问题)。
var query = (from post in db.Posts 
            where(
                    from posttag in db.PostTags
                    join tags in db.Tags
                    on posttag.TagID equals tags.TagID   
                    where tags.TagName == tag select posttag.PostID
                ).Contains(post.PostID) 
            orderby post.PublishDate descending 
            select post).Take(25);