2010-09-05 60 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