[英]How to “undo” a Projection in Fluent NHibernate?
我必须显示一些存储在关系数据库中的对象,并使用流畅的NHibernate来获取它们。
由于需要分页,因此我必须同时获取所有对象的数量和当前页面本身的对象。
这两个目的的ICriteria非常相似-对于计数,我最终添加.SetProjection(Projections.RowCount()) ,对于当前对象列表,我添加SetFirstResult,AddOrder和SetMaxResults
我有什么办法可以取消对标准的预测并重新使用结果本身的标准,还是为此目的必须重构标准?
休眠论坛提出了一种行不通的方法。
我将编写一种封装查询逻辑的方法,包括限制,分组,...:
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.