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

发布于 2024-08-14 06:57:57 字数 458 浏览 2 评论 0原文

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

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

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

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

hibernate 论坛建议了一种不工作。

I have to display some objects which are stored in a relational database and I use fluent NHibernate to get them.

Since I need paging, I have to get both - the count of all objects, and the objects for the current page themselves.

The ICriteria for both purposes is very similar up to a point - for count i finally add
.SetProjection(Projections.RowCount())
and for current object list I add
SetFirstResult, AddOrder and SetMaxResults

Is there any way I could undo the projection on the criteria and reuse criteria for the results themselves, or do I have to reconstruct the criteria for that purpose?

hibernate forums suggests a way that does not work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

埋葬我深情 2024-08-21 06:57:57

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

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。

I would write a method encapsulating the query logic including restrictions, grouping, ...:

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

And then send requests to the database:

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

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

To further optimize this you could take a look at this excellent blog post in which Ayende Rahien talks about NHibernate Futures.

逆流 2024-08-21 06:57:57
public static DetachedCriteria Clone(this DetachedCriteria criteria)
{
   var dummy = criteria.ToByteArray();
   return dummy.FromByteArray<DetachedCriteria>();
}
var criteria = GetCriteria()
变量计数 = 标准 
    。克隆()
    .GetExecutableCriteria(会话)
    .SetProjection(Projections.Count(Projections.Id()))
    .UniqueResult();

var 结果 = 标准 
    .GetExecutableCriteria(会话)
    .SetFirstResult(0) 
    .设置最大结果(10)
    .List<实体>();
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>();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文