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

问题描述 投票:0回答:2

这是我试图解决的问题,我想获得 nhibernate linq 查询,这将使我能够做到这一点。所以我有一个名为“组织”的表,其中包含名称和 ID。假设它有 10。


  1. id=1 名称=“D”
  2. id=2 名称=“B”
  3. id=3 名称=“C”
  4. id=4 名称=“E”
  5. id=5 名称=“F”
  6. id=6 名称=“G”
  7. id=7 名称=“h”
  8. id=8 名称=“i”
  9. id=9 名称=“j”
  10. id=10 名称=“k”

我想对组织进行如下寻呼。

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

c# pagination nhibernate
2个回答
1
投票

不确定

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

1
投票

它的工作原理应该大致如下:

int index = 0;
int pageSize = 2;
session.Query<ModelClass>().OrderBy(m => m.Name).Skip(index * pageSize).Take(pageSize);
© www.soinside.com 2019 - 2024. All rights reserved.