左连接、不同和使用 QueryOver 进行分页

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

我有这样的问题,这似乎很常见,但事实上,SO 和谷歌的解决方案都不适合我。

让我们考虑一下这种情况(与我的非常相似):

    public class User
    {
     public int Id;
     public string Name;
     //30 other fields;
     public IList<Role> Roles;
    }

    public class Role
    {
     public int RoleNumber;
     public int UserId;
    }

1 个用户可以拥有 0-多个角色。

我想在网格视图上显示用户列表及其字段和附加“角色”列,该列将显示他的所有角色编号(使用中继器)。为了实现这一点,我需要获取具有不同角色的用户列表。

是否可以使用 QueryOver 创建此类查询?互联网上的所有解决方案都说我应该创建将 Ids 的子查询,然后创建第二个查询,它将返回子查询中 Id 的用户。它可以工作并返回给我不同的列表,但没有角色,因此 NH 为每个用户生成额外的选择来获取缺失的信息。

我的询问:

Role roles = null;
User users = null;
IQueryOver<User,User> userQuery = ... 
IQueryOver<User,User> distQuery = ...
distQuery.JoinAlias(f=> f.Roles, () => Roles, JoinType.LeftOuterJoin)
         .Select(Projections.Distinct(Projections.Id()));

userQuery.WithSubquery.WhereProperty(g => g.Id).In<User>((QueryOver<User>)    distQuery) //and other joins, wheres etc.

返回没有角色的不同列表

如果我将第二个加入添加到角色中,它将返回包含角色和重复项的列表

如果我将第二个加入添加到角色并使用

TransformUsing(new DistinctRootEntityResultTransformer())

它将返回包含用户及其角色的不同列表,但分页不起作用,并且 RowCount() 将返回错误的数字。

有什么想法我能做什么吗?

join pagination nhibernate distinct queryover
1个回答
3
投票

基本上,NHibernate 目前不支持您所要求的功能。您无法急切加载

Users
Roles
并保持检查分页。

我首先会获取分页的用户列表(例如 25),然后在需要时延迟加载角色。

Session.QueryOver<User>().Skip(x).Take(25);

并将映射文件更改为:-

<bag class="Role" Name="Roles" batch-size='25' ...>
...
</bag>

这将发送一个查询来检索分页列表

Users
,然后发出第二个查询来获取用户的所有角色。这是迄今为止最高效的方式。

© www.soinside.com 2019 - 2024. All rights reserved.