2010-09-05 29 views
1

我正在写一个ASP.NET MVC网站,我正在使用LINQ to SQL来访问我的SQL Server数据库。在我的数据库,我有以下表格:是否适合在LINQ to SQL中完成此类功能?

帖子

  • 帖子ID - INT,PK,身份
  • 文本 - 为nvarchar(MAX)
  • PublishDate - 日期时间

PostTags

  • PostTagID - INT,PK,身份
  • 帖子ID - FK来PK,以岗位表
  • 标签识别 - FK来PK到标签表

标签

  • 标签识别 - INT,PK,身份
  • 标签名 - VARCHAR(100)

每个职位至少要有1标签,所以这是一个单一对多关系。

我正试图建立一个标签搜索功能。我想接受标签作为参数返回前25个标签为,由PublishDate降序排列的帖子。这里是我当前的LINQ to 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); 

不过,我认为我的代码是错误的,因为它似乎不尊重帖子和标签之间的单一对多的关系。

我该如何改进我的代码?提前致谢!

+0

与其简单地说“它不工作”,您应该发布您的预期结果以及实际得到的结果。 – 2010-09-05 22:13:47

+0

@Adam我没有测试代码,但我很确定它不会工作,因为PostTags中可能有多个记录具有相同的PostID。 – 2010-09-05 22:18:40

+0

我的钱在数据上。你能否给我们一些样本记录并显示哪些记录(如果有的话)被退回? – SteveCav 2010-09-05 22:24:19

回答

1
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); 
+0

真棒,谢谢,现在就试试看。顺便说一下,Visual Studio抱怨“on ...”行应该是“on posttag.TagID equals tags.TagID”。 – 2010-09-05 22:46:36

+0

@Maxim Zaslavsky真的吗?对我来说这是个大新闻。谢谢(修复)。 – garik 2010-09-05 22:56:32

+0

我看不出如何这可能比原来的代码更好,除非'PostTags'可以有重复记录(在这种情况下,你有你的设计问题)。 – 2010-09-05 23:39:39