NHibernate - 使用 CreateMultiQuery

NHibernate - using CreateMultiQuery

我的对象模型包含一个 Server 实体,该实体具有 AdapterConfiguration 对象的集合。

我正在尝试弄清楚如何使用 this article 中概述的多查询有效地检索 Server 的详细信息。

到目前为止,根据链接的文章,我有以下内容..

var query1 = "from Server s left outer join s.Adapters pa where s.ServerID = :serverID";
var query2 = "from Server s left outer join s.Configurations cc where s.ServerID = :serverID";

var result = Session.CreateMultiQuery()
                    .Add(Session.CreateQuery(query1))
                    .Add(Session.CreateQuery(query2))
                    .SetParameter("serverID", s.ServerID)
                    .List();

此时 result 包含 2 元素列表的列表。第一个包含成对的 Server& Adapter 对象,而第二个包含成对的 Server& Connection 对象。

我的问题是我无法从 result 获取单个 Server 对象,同时填充两个列表。

所以我成功了 - 使用 Criteria 而不是 HQL。解决方案如下。

var criteria1 = DetachedCriteria.For<Server>()
                    .Add(Restrictions.Eq("ServerID", s.ServerID))
                    .SetFetchMode("Adapters", FetchMode.Eager)
                    .CreateCriteria("Adapters", JoinType.LeftOuterJoin);

var criteria2 = DetachedCriteria.For<Server>()
                    .Add(Restrictions.Eq("ServerID", s.ServerID))
                    .SetFetchMode("Configurations", FetchMode.Eager)
                    .CreateCriteria("Configurations", JoinType.LeftOuterJoin);

var result = Session.CreateMultiCriteria()
                    .Add(criteria1)
                    .Add(criteria2)
                    .List();

IList list = (IList)result[0];
var server = list[0] as Server;      

不确定为什么这行得通而 HQL 却行不通,因为从 C# 的角度来看,它们似乎 正在做完全相同的事情。很明显,由于两种方法生成的 SQL 差异很大,所以在幕后有些东西是完全不同的。

我仍然更喜欢使用 HQL,因为它看起来更具可读性 - 但现在就可以了。