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

时间:2011-12-20 13:11:15

标签: nhibernate join paging distinct queryover

我有这样的问题似乎很常见,但实际上没有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多个角色。

我希望在gridview的用户列表中显示其字段和其他&#34;角色&#34;列将显示他的所有RoleNumbers(使用repeater)。为了获得这一点,我需要获得具有其角色的用户的区别列表。

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

任何想法我该怎么办?

1 个答案:

答案 0 :(得分:3)

NHibernate目前不支持您所要求的内容。您无法急切加载UsersRoles并继续检查分页。

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

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

并将您的映射文件更改为: -

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

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