2014-02-24 4 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, 멋진 도구를 즐기십시오;) –

관련 문제