2014-02-24 51 views
2

试图为具有使得别名使用别名的值的列表的关系生成nhibernate查询。JoinOverQuery与包含​​列表的多个表

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

我是迄今做的是不工作:

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

问题到底是什么?或者你得到了什么明显的错误? – rae1

+0

对不起,最初应该做到这一点。现在把它扔了 – SomeoneRandom

回答

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()正确分页...

+0

谢谢,你说得对我滥用WhereRestrictionOn – SomeoneRandom

+0

好,如果有帮助。享受NHibernate,真棒工具;) –