nhibernate - 左连接、非重复和使用 QueryOver 进行分页

标签 nhibernate join paging distinct queryover

我遇到了这样的问题,这似乎很常见,但实际上 SO 和 google 的解决方案都不适合我。

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

    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-多个角色。

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

是否可以使用 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() 将返回错误的数字。

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

最佳答案

基本上,NHibernate 目前不支持您所要求的内容。您无法预先加载UsersRoles并保持分页检查。

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

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

并将映射文件更改为:-

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

这将发送一个查询来检索分页的用户列表,然后发出第二个查询来获取用户的所有角色。这是迄今为止最高效的方式。

关于nhibernate - 左连接、非重复和使用 QueryOver 进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8575984/

相关文章:

Nhibernate - QueryOver。 IsLike 具有多个条件

mysql - 用于从两个连接表获取数据的优化 SQL(来自两个表的 user-from-id 和 user-to-id 消息的用户名)

asp.net-mvc-3 - MVC3 razor Webgrid 分页和排序超过 2000 条记录

jquery - 虚拟滚动/分页

mysql - 通过可连接的方式加入具有最大值的行

ios - 使用分页显示 UICollectionView 的正确方法

c# - 更改 NHibernate 中的初始 LazyLoad 行为

c# - 模拟 EntityEntry NHibernate

asp.net - 我可以在 GoDaddy 上使用 NHibernate 吗?

mysql - 查询中内部和外部连接在一起,可能