我有这样的问题,这似乎很常见,但事实上,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() 将返回错误的数字。
有什么想法我能做什么吗?
基本上,NHibernate 目前不支持您所要求的功能。您无法急切加载
Users
和 Roles
并保持检查分页。
我首先会获取分页的用户列表(例如 25),然后在需要时延迟加载角色。
Session.QueryOver<User>().Skip(x).Take(25);
并将映射文件更改为:-
<bag class="Role" Name="Roles" batch-size='25' ...>
...
</bag>
这将发送一个查询来检索分页列表
Users
,然后发出第二个查询来获取用户的所有角色。这是迄今为止最高效的方式。