NHibernate Criteria有多个结果

时间:2009-03-27 11:44:39

标签: c# nhibernate

使用HQL,您可以构建如下所示的查询,该查询将通过在select子句中使用逗号分隔列表为每个选定的行返回一个对象数组:

选择 mother,offspr,mate.Name 来自Eg.DomesticCat作为母亲     内心加入妈妈。作为伴侣     左外连接mother.Kittens as offspr

您如何使用ICriteria执行此操作?具体来说,我正在尝试构建一个分页查询,该查询也返回同一查询中的总行数。

Ayende展示了如何使用HQL(http://ayende.com/Blog/archive/2007/04/27/Paged-data--Count-with-NHibernate-The-really-easy-way.aspx)完成此任务。我需要使用ICriteria来复制它。

4 个答案:

答案 0 :(得分:4)

我认为答案在于预取你想要的关联。这样,您可以一次性获取对象图形所需的部分。您可以在标准查询中执行此操作。

ICriteria query = session.CreateCriteria(typeof (Cat))
.SetFetchMode("Mate", FetchMode.Join)
.SetFetchMode("Kittens", FetchMode.Join);

IList<Cat> results = query.List<Cat>();

这将为您提供一份包含Mate和Kittens预先填充的猫的列表。然后,您可以导航到这些属性,而不会产生N + 1惩罚。如果你需要一个更扁平的结果我会用linq来做,也许是这样的。

var results = query.List<Cat>()
  .Select((c) => new {mother = c, mate = c.Mate, offspr = c.Kittens});

这将为您提供具有给定属性的匿名类型的扁平列表。如果你需要的只是预取对象图,这将有效。但是,如果您需要预取计数或总和等内容,则需要检查Criteria查询的预测和别名部分。

还有一件事。如果您尝试完全复制上述查询,可以这样做。

ICriteria query = session.CreateCriteria(typeof (Cat), "mother")
.CreateAlias("Mate", "mate", JoinType.InnerJoin)
.CreateAlias("Kittens", "offspr", JoinType.LeftOuterJoin)
.SetResultTransformer(Transformers.AliasToEntityMap);

这将使您与hql查询基本相同,但是不使用索引列表,而是使用将别名映射到实体的字典。

答案 1 :(得分:2)

您可以通过这种方式将您的条件转换为计数条件

DetachedCriteria countCriteria = CriteriaTransformer.TransformToRowCount(criteria); // criteria = your criteria
rowCount = countCriteria.GetExecutableCriteria(session).UniqueResult<int>();

答案 2 :(得分:1)

Ayende还添加了多标准支持:http://ayende.com/Blog/archive/2007/05/20/NHibernate-Multi-Criteria.aspx。那显然是在2.0版本中。

答案 3 :(得分:0)

您还可以通过操作Criteria上的结果集来进行分页:

ICriteria query = session.CreateCriteria(typeof(Cat),“mother”)

query.SetFirstResult(X); // x =页面开始

query.SetMaxResults(Y); // y =页面大小

列出结果= query.List();