4:单表自连接的查询。沿用前面Repository中的3表嵌套查询结构体的SearchBy*函数
(1)当自连接至本表的 N—>1 属性时,即 FeedBack2(N)—>(1)FeedBack
在反馈表结构中,我们可以看到:FeedBackMap.cs
public FeedBackMap() { Id(o => o.Id); Map(o => o.CreateTime); Map(o => o.IsDelete); Map(o => o.Version); Map(o=>o.EntityIndex); Map(o=>o.Contents); Map(o => o.Type); References<LoginUser>(o => o.LoginUser).Not.Nullable();
References<FeedBack>(o => o.ParentFeedBack); HasMany<FeedBack>(o => o.ChildFeedBacks).Inverse().Cascade.All(); }
查询界面如下:我们默认,显示的列表页,是ParentFeedBack为Null的列表,即只显示主题
我们期望,在点击每一行的反馈是,在下面能够显示,该条目的详细信息,以及管理员对该条目的回复信息,以信件的格式如下:
问题就在这里,我们要 用FeedBack 连接到 ParentFeedBack[FeedBack] ,做连接,加载出ParentFeedBack_id 为 反馈信息的ID 的 FeedBack 对象
此时,我们只需对Repository.ce 中的SearchByFeedBack()做如下修改:
string alias = string.Empty; if (deepIndex > 0) { notself = "feedBack."; if (deepIndex == 1) { parentSearch = "ParentFeedBack"; //第二次加载到FeedBack查询ParentFeedBack时,加载此处时,参照Map文件中的属性命名 alias 做链接
} else { parentSearch = parentSearch + ".FeedBack"; } alias = parentSearch; query.CreateAlias(alias, "feedBack"); } deepIndex++;
当然,在对比判断条件时,还得做如下修改:
if (df.type.Equals("ParentFeedBack")) { query.Add(Restrictions.IsNull(notself + "ParentFeedBack")); //满足现实的List页都是反馈的主题,即文章刚开始提到的要求 continue; } if (df.type.Equals("ParentFeedBackForTwo")) //做自连接,第二次加载 { // query.Add(Restrictions.Eq(notself + "ParentFeedBack", df.value)); SearchByFeedBack(query, df.field, ref deepIndex, ref parentSearch); continue; } if (df.type.Equals("ParentFeedBackId")) //做自连接,第二次加载,与“第二张表”做链接,Id { query.Add(Restrictions.Eq(notself + "Id",df.value)); continue; }