gpt4 book ai didi

nhibernate - 使用 QueryOver 进行左连接、不同和分页

转载 作者:行者123 更新时间:2023-12-04 06:04:11 25 4
gpt4 key购买 nike

我有这样的问题,这似乎很常见,但实际上 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.

返回没有角色的不同列表

如果我将 2nd Join 添加到 Roles,它将返回包含 Roles 和重复项的列表

如果我将 2nd Join 添加到 Roles 并使用
TransformUsing(new DistinctRootEntityResultTransformer())

它将返回带有用户和角色的不同列表,但分页不起作用,RowCount() 将返回不正确的数字。

任何想法我能做什么?

最佳答案

基本上,NHibernate 目前不支持您所要求的内容。你不能急切加载 UsersRoles并检查分页。

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

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

并将您的映射文件更改为:-
<bag class="Role" Name="Roles" batch-size='25' ...>
...
</bag>

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com