C# nhibernate分页查询以获取下一组结果
这就是我试图解决的问题,我想得到nhibernate linq查询,这将允许我能够做到这一点。所以我有一个名为organization的表,它有名称和id。假设这个表有10个C# nhibernate分页查询以获取下一组结果,c#,nhibernate,paging,C#,Nhibernate,Paging,这就是我试图解决的问题,我想得到nhibernate linq查询,这将允许我能够做到这一点。所以我有一个名为organization的表,它有名称和id。假设这个表有10个 id=1 Name=“D” id=2 Name=“B” id=3 name=“C” id=4 name=“E” id=5 name=“F” id=6 name=“G” id=7 name=“h” id=8 name=“i” id=9 name=“j” id=10 name=“k” 我想按如下方式对组织进行分页 第一次使用
现在第二轮我想得到下一组2个组织,它们位于字母表中的第二个元素之后,所以在本例中,我希望得到id=1和id=4的组织,所以我传入index=1、pagesize=2和LastElementId=3。你能帮我查询一下id为1和4的Org吗?出于性能原因,我希望不必获取所有10个元素并在这些元素上执行foreach等操作。它的工作原理大致如下:
int index = 0;
int pageSize = 2;
session.Query<ModelClass>().OrderBy(m => m.Name).Skip(index * pageSize).Take(pageSize);
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索引=0;
int pageSize=2;
session.Query().OrderBy(m=>m.Name).Skip(索引*页面大小).Take(页面大小);
不确定索引
变量的用途,但您似乎正在寻找如下所示的SQL:
int index = 0;
int pageSize = 2;
session.Query<ModelClass>().OrderBy(m => m.Name).Skip(index * pageSize).Take(pageSize);
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>();
}
选择
顶部(2)*
从…起
[我的实体]
订购人
[MyEntity][Name]asc
(对于第一个查询)
对于后续查询:
选择
顶部(2)*
从…起
[我的实体]
哪里
[MyEntity].[Name]>(
选择[LastEntity]。[Name]
来自[MyEntity]作为[LastEntity]
其中[LastEntity].[Id]=3--LastElementId
)
订购人
[MyEntity][Name]asc
使用QueryOver,可以这样写:
int index = 0;
int pageSize = 2;
session.Query<ModelClass>().OrderBy(m => m.Name).Skip(index * pageSize).Take(pageSize);
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>();
}
公共IList性能查询(
会议期间,
int pageSize,
int?lastElementId)
{
var query=session.QueryOver();
if(lastElementId.HasValue)
{
查询,在哪里(
限制.GtProperty(
Projections.Property(e=>e.Name),
子查询(
(的)查询
.Where(le=>le.Id==lastElementId.Value)
.Select(le=>le.Name));
}
返回query.OrderBy(e=>e.Name).Asc
.Take(页面大小)
.List();
}
谢谢你的回复,德克,这很有效,但这正是我要确保在organization name=“c”之后选择下两个元素的部分。可能在第一次查询之后插入了其他组织,因此跳过不会真正删除它如果您担心其他元素会添加到列表中,那么您需要对所有元素运行查询,并将它们放在缓存中的某个位置,然后对缓存的版本运行相同的查询,不是实时数据库。谢谢安德鲁,这正是我要找的。