繁体   English   中英

如何在Fluent NHibernate中“撤消”投影?

[英]How to “undo” a Projection in Fluent NHibernate?

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

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

这两个目的的ICriteria非常相似-对于计数,我最终添加.SetProjection(Projections.RowCount()) ,对于当前对象列表,我添加SetFirstResult,AddOrderSetMaxResults

我有什么办法可以取消对标准的预测并重新使用结果本身的标准,还是为此目的必须重构标准?

休眠论坛提出了一种行不通的方法。

我将编写一种封装查询逻辑的方法,包括限制,分组,...:

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期货。

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>(); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM