我有这样的问题,这似乎是常见的,但实际上没有从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-多个角色。
我想在网格视图上显示用户列表与它的字段和额外的“角色”列,这将显示他的所有RoleNumbers (使用中继器)。要获得它,我需要获得用户及其角色的不同列表。
可以用QueryOver创建这样的查询吗?所有来自互联网的解决方案都说,我应该创建子查询,这将Id,然后第二个查询,这将返回用户的Id在子查询。它工作并向我返回区别列表,但没有角色,因此NH为每个用户生成额外的select,以获取丢失的信息。
我的问题是:
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()将返回错误的数字。
你知道我能做什么吗?
发布于 2011-12-20 23:20:40
基本上,NHibernate目前不支持您所要求的内容。您不能立即加载Users和Roles并控制分页。
我会首先得到一个分页的用户列表(例如25个),然后在你需要的时候延迟加载角色。
Session.QueryOver<User>().Skip(x).Take(25);并将映射文件更改为:-
<bag class="Role" Name="Roles" batch-size='25' ...>
...
</bag>这将发送一个查询来检索分页的Users列表,然后发出第二个查询来获取用户的所有角色。这是到目前为止性能最好的方法。
https://stackoverflow.com/questions/8575984
复制相似问题