nhibernate Paging查询获取下一组结果

时间:2014-10-02 09:17:25

标签: c# nhibernate paging

这是我试图解决的问题,我想得到nhibernate linq查询,这将允许我能够做到这一点。所以我有一个叫做组织的表,它有一个名字和一个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”
  11. 我想按如下方式对组织进行分页。

    首次使用我传入索引0和pageSize = 2以及orderby =“name” 因此这将返回带有** [id = 2,name = B]和[ id = 3 name = C] 这很简单。 现在第二次我希望得到下一组2个组织,这些组织位于字母表中的第二个元素之后所以在这种情况下我希望得到orgs id = 1且id = 4 ,所以我通过在index = 1,pagesize = 2和LastElementId = 3。你可以帮我查询一下id = 1和4的组织。出于性能原因,我想防止必须得到所有10个元素,并在这些元素上做foreach等。

2 个答案:

答案 0 :(得分:1)

它的工作原理大致如下:

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

答案 1 :(得分: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>();
}