【问题标题】:How to "undo" a Projection in Fluent NHibernate?如何在 Fluent NHibernate 中“撤消”投影?
【发布时间】:2009-12-09 18:34:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# fluent-nhibernate projection icriteria


    【解决方案1】:

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

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

    要进一步优化这一点,您可以查看这篇出色的博客 post,其中 Ayende Rahien 谈到了 NHibernate Futures。

    【讨论】:

      【解决方案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>();
      

      【讨论】:

      • ICriteria 现在实现了 IClonable,所以你可以调用已经实现的 Clone 方法。
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多