关于此问题有很多问题,但没有足够的确切答案,特别是使用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