JoinOverQuery包含多个包含列表的表

时间:2014-02-24 16:42:49

标签: c# sql nhibernate

尝试为包含使用别名的值列表的关系生成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",

1 个答案:

答案 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()来进行正确的分页...