尝试为包含使用别名的值列表的关系生成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",
答案 0 :(得分:2)
本例中的语法必须如下:
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()
来进行正确的分页...