0

我必须显示一些存储在关系数据库中的对象,并且我使用流利的 NHibernate 来获取它们。

由于我需要分页,因此我必须同时获取所有对象的计数以及当前页面本身的对象。

用于这两种目的的 ICriteria 在某种程度上非常相似 - 对于计数,我最后添加 了 .SetProjection(Projections.RowCount()) ,对于当前对象列表,我添加 了 SetFirstResult、AddOrderSetMaxResults

有什么办法可以撤消对标准的投影并为结果本身重用标准,还是我必须为此目的重建标准?

hibernate forums提出了一种行不通的方法。

4

2 回答 2

2
public static DetachedCriteria Clone(this DetachedCriteria criteria)
{
   var dummy = criteria.ToByteArray();
   return dummy.FromByteArray<DetachedCriteria>();
}
var criteria = GetCriteria()
var count = criteria 
    .Clone()
    .GetExecutableCriteria(session)
    .SetProjection(Projections.Count(Projections.Id()))
    .UniqueResult<int>();

var result = criteria 
    .GetExecutableCriteria(session)
    .SetFirstResult(0) 
    .SetMaxResults(10)
    .List<Entity>();
于 2010-07-17T10:37:52.583 回答
2

我会编写一个封装查询逻辑的方法,包括限制、分组……:

public DetachedCriteria GetCriteria()
{
    return DetachedCriteria.For<Entity>()
        .Add(Restrictions.Eq(...))
        .Add(...);
}

然后向数据库发送请求:

var count = GetCriteria()
    .GetExecutableCriteria(session)
    .SetProjection(Projections.Count(Projections.Id()))
    .UniqueResult<int>();

var result = GetCriteria()
    .GetExecutableCriteria(session)
    .SetFirstResult(0) 
    .SetMaxResults(10)
    .List<Entity>();

要进一步优化这一点,您可以查看Ayende Rahien 谈论 NHibernate Futures的这篇出色的博客文章。

于 2009-12-09T18:41:01.483 回答