这是我试图解决的问题,我想获得 nhibernate linq 查询,这将使我能够做到这一点。所以我有一个名为“组织”的表,其中包含名称和 ID。假设它有 10。
我想对组织进行如下寻呼。
第一次使用时,我传入 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 等操作。
不确定
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);