我有这样的问题似乎很常见,但实际上没有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()将返回错误的号码。
任何想法我该怎么办?
答案 0 :(得分:3)
NHibernate目前不支持您所要求的内容。您无法急切加载Users
和Roles
并继续检查分页。
我首先会得到一个分页用户列表(例如25个),然后在需要时延迟加载角色。
Session.QueryOver<User>().Skip(x).Take(25);
并将您的映射文件更改为: -
<bag class="Role" Name="Roles" batch-size='25' ...>
...
</bag>
这将发送一个查询以检索分页Users
的列表,然后发出第二个查询以获取用户的所有角色。这是迄今为止最高效的方式。