NHibernate - 使用 CreateMultiQuery
NHibernate - using CreateMultiQuery
我的对象模型包含一个 Server
实体,该实体具有 Adapter
和 Configuration
对象的集合。
我正在尝试弄清楚如何使用 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,因为它看起来更具可读性 - 但现在就可以了。
我的对象模型包含一个 Server
实体,该实体具有 Adapter
和 Configuration
对象的集合。
我正在尝试弄清楚如何使用 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,因为它看起来更具可读性 - 但现在就可以了。