nhibernate分页查询以获取下一组结果

本文关键字:一组 结果 分页 查询 获取 nhibernate | 更新日期: 2023-09-27 18:25:16

这是我试图解决的问题,我想获得nhibernate linq查询,这将使我能够做到这一点。所以我有一个名为organization的表,它有Name和id。假设这个有10。


  1. id=1 Name="D"
  2. id=2 Name="B"
  3. id=3 name="C"
  4. id=4 name="E"
  5. id=5 name="F"
  6. id=6 name="G"
  7. id=7 name="h"
  8. id=8 name="i"
  9. id=9 name="j"
  10. id=10 name="k"

我想按如下方式对组织进行分页。

第一次使用时,我传入索引0和pageSize=2以及orderby="name",因此这将返回带有**[id=2,name=B]和[id=3 name=C]的组织这很简单现在第二次,我想得到下一组2个组织,它们在字母表中的第二个元素之后,所以在这种情况下,我希望得到id=1和id=4的组织,所以我传入index=1,pagesize=2和LastElementId=3。你能帮我查询id为1和4的组织吗?出于性能原因,我想避免必须获取所有10个元素,并在这些元素上执行foreach等操作。

nhibernate分页查询以获取下一组结果

不确定index变量的用途,但您似乎在寻找如下所示的SQL:

select
    top (2) *
from    
    [MyEntity]
order by
    [MyEntity].[Name] asc

(针对第一个查询)

以及这个,用于后续查询:

select
    top (2) *
from    
    [MyEntity]
where
    [MyEntity].[Name] > (
        select [LastEntity].[Name]
        from [MyEntity] as [LastEntity]
        where [LastEntity].[Id] = 3 --LastElementId
    )
order by
    [MyEntity].[Name] asc

使用QueryOver,可以这样写:

public IList<MyEntity> PerformQuery(
    ISession session,
    int pageSize,
    int? lastElementId)
{
    var query = session.QueryOver<MyEntity>();
    if (lastElementId.HasValue)
    {
        query.Where(
            Restrictions.GtProperty(
                Projections.Property<MyEntity>(e => e.Name),
                Projections.SubQuery(
                    QueryOver.Of<MyEntity>()
                        .Where(le => le.Id == lastElementId.Value)
                        .Select(le => le.Name))));
    }
    return query.OrderBy(e => e.Name).Asc
        .Take(pageSize)     
        .List<MyEntity>();
}

它应该大致如下工作:

int index = 0;
int pageSize = 2;
session.Query<ModelClass>().OrderBy(m => m.Name).Skip(index * pageSize).Take(pageSize);