假设我有一个包含主题、帖子和标签的论坛系统。结构与 StackOverflow 相同:Threads 与 Posts 是一对多关系,Tags 与 Threads 是多对多关系。
(简化)表:
Thread
------
ThreadID int PK
Title varchar(200)
Tag
----
TagID int PK
Name varchar(50)
ThreadTag
-----------
ThreadTagID int PK
ThreadID int FK
TagID int FK
所以 SubSonic ActiveRecord 模板为我生成了我的课程。
代码
对于首页,我需要获取线程列表,并将其相关标签列表附加到每个线程。撇开帖子不谈,检索标签和构建此对象图的最佳方法是什么?
如果我得到这样的线程:
var threadQuery = Thread.All().Skip(x).Take(n);
var threadList = threadQuery.ToList();
我应该将“ IList<Tag> Tags
”属性添加到 Thread 类的一部分吗?
为了检索正确的标签,我应该执行两个查询:一个获取 ThreadTags,一个获取标签本身:例如
var tagLinks = (from t in threadQuery
join l in ThreadTag.All() on t.ThreadID equals l.ThreadID
select l).ToList();
var tags = (from t in threadQuery
join l in ThreadTag.All() on t.ThreadID equals l.ThreadID
join tg in Tag.All() on l.TagID equals tg.TagID
select tg).ToList();
...然后使用这些列表将标签排序到正确的 Thread.Tags 列表中?
有没有更好的办法?我认为我不能使用 SubSonic 使用外键生成的 IQueryable 属性,因为这会触发我列表中每个线程的数据库调用。