gpt4 book ai didi

c# - 具有包含列表的多个表的 JoinOverQuery

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:37 25 4
gpt4 key购买 nike

尝试为具有值列表的关系生成 nhibernate 查询,这使得使用别名变得棘手。

一个用户可以有多个角色或租户,我想选择所有具有特定角色和特定租户的用户。

到目前为止我所做的没有奏效:

var query = Session.QueryOver<User>();

query.JoinQueryOver<Role>(x => x.Roles)
.WhereRestrictionOn(x => x.Id == roleId);

query.JoinQueryOver<Tenant>(x => x.Tenants)
.WhereRestrictionOn(x => x.Abbreviation == Context.Abbreviation);

对此有什么建议吗?当我尝试使用别名时遇到了一个问题,我需要使用 .Contains 方法,但我认为 nhibernate/sql 无法弄清楚如何处理它。

这是我在点击第一个 JoinQueryOver 时遇到的错误

"message": "An error has occurred.",
"exceptionMessage": "variable 'x' of type 'Role' referenced from scope '', but it is not defined",
"exceptionType": "System.InvalidOperationException",

最佳答案

这种情况下的语法必须是这样的:

query.JoinQueryOver<Role>(x => x.Roles)
//.WhereRestrictionOn(x => x.Id == roleId)
.Where(x => x.Id == roleId)
;

WhereRestrictionOn 可以用于这样的场景:

.WhereRestrictionOn(() => role.Name)
.IsLike("Admin", MatchMode.Start)

但我会建议,如果可能的话,使用子查询。 (如果集合项引用了父项)

User user = null;
Role role = null;

// the subselect, filtering the Roles, returning the user ID
var subQuery = QueryOver.Of<Role>(() => role)
.Where(() => role.ID == roleId)
.Select(c => role.User.ID);


// the query of the User,
// where at least one role fits the above subquery
var query = session.QueryOver<User>(() => user)
.WithSubquery
.WhereProperty(() => user.Id)
.In(subQuery);

在许多其他优点中,这种方法将为我们提供一个平根 User 表,因此我们可以应用 Skip()Take() 正确的分页...

关于c# - 具有包含列表的多个表的 JoinOverQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21993665/

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