關於此問題有很多問題,但沒有足夠的確切答案,特別是使用SQL Server,我在這種情況下。選擇所有帖子及其所有標籤
我有3個表格來表示與之相關的博客文章和標籤。我想運行一個查詢,它將獲得所有帖子和每個帖子標籤 - 我需要標籤ID和名稱。結果需要輕鬆地序列化到我的C#類中。我也試圖使用Dapper.net,但這不是最重要的部分。
顯然很多網站都這樣做,我想知道最好的方式,以及它應該如何在現實世界中完成?我可以獲取所有帖子,然後爲每個帖子運行多個查詢,以便返回每個帖子的標籤。但肯定會有更好的方法?
如果我只是想獲得一篇文章,那麼我只會寫多個選擇。一個是帖子,一個是標籤。但我想要所有的帖子。有沒有這樣做的方式,而不復制每個返回的標記行的發佈信息?
如果每個帖子的標籤都被串行化成一個以逗號分隔的列,那麼如何才能同時獲得id和名稱?編碼字符串?
SELECT * FROM dbo.Posts
SELECT * FROM dbo.Tags
SELECT * FROM dbo.PostTags
Posts
Id Title Content
===============================
1 First Post First Content
3 Second Second Content
Tags
Id Name
============
1 C#
2 SQL
3 IIS
4 Steam
5 OpenID
PostTags
PostId TagId
=============
1 1
1 2
3 3
3 4
只需用下面的查詢連接表:
Id Title Content Name
======================================
1 First Post First Post C#
1 First Post First Post SQL
3 Second Post Second Content IIS
3 Second Post Second Content Steam
這將是一個非常醜陋的黑客攻擊,但我已經看到了它在生產中使用你沒事與他們合併成一列,然後在C#解析結束之前...?例如,標籤列可能如下所示:「{{{1 ||| C#}}} {{{2 ||| SQL}}}」等等(格式爲{{{ID |||姓名}}} ...) – Ruslan
嗯,我在想,我希望看到什麼最好的做法是關於這種事情 - 我認爲這是相當普遍的事情不是? 我也希望利用Dapper.net(微ORM) - 我不認爲它可以處理之類的事情開箱。 – Ant
這絕對與最佳實踐(特別是當您在討論.NET和OOP以及ORM時)相距甚遠,但由於性能和帶寬的原因,它有時在現實世界中使用(就像許多其他非常黑客的事情一樣)注意事項。另一種可能更好的方式仍然有些過時,但並不像上面那樣醜陋,是要返回多個結果集(不知道Dapper是否可以處理該結果集)。因此,在第一個結果中,標籤列將僅包含以逗號分隔的標籤ID列表,而第二個結果將設置實際的標籤列表(以及它們的含義)。 – Ruslan