尝试为具有值列表的关系生成 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()
正确的分页...
我是一名优秀的程序员,十分优秀!