2015-02-01 2 views
0

제목에서 알 수 있듯이 나는 그런 쿼리를 만들어야한다. 내 데이터베이스에서 나는 테이블 House와 테이블 Room을하고 난 지금 roomId의이 각 집에 고유하지 세계적 때문에, Room 테이블에서 House 테이블에서 houseIdroomId에 따라 쿼리를 만들 수 있도록하려면 전체 테이블. 어떻게 NHibernate Fluent에서 그렇게 할 수 있을까요?여러 테이블에서 선택하기 NHibernate

Room room = (session.QueryOver<Room>() 
       .JoinQueryOver<House>() 
       .Where(r => r.Number == roomNumber) && (h => h.Id == houseId); 

그러나 적절한 유창함 구문과 방법 :

나는 이런 식으로 뭔가를해야합니다. 나는 인터넷을 통해 비슷한 예를 찾을 수 없었다.

또한 하위 쿼리를 시도했지만 하위 쿼리를 사용하여 유추 할 수없는 오류가 발생했습니다.

var subquery = session.QueryOver<House>() 
       .Where(h => h.Name == houseName); 


var query = session.QueryOver<Room>(() => room) 
       .Where(r => r.Number == roomNumber) 
       .WithSubquery.WhereProperty(() => roomNumber) 
       .In(subquery); 

답변

0

확실하지 무엇을 HouseRoom 사이의 관계이지만, HouseId 포함되어 있음을 예상 할 수 있습니다. 하위 쿼리와

버전은 다음과 같이 될 수있다 :

조인과 버전은 다음과 같이 될 수
var houseName = "..."; 
var roomNumber = ...; 

// prefilter houses 
// first change fromt he question above here is 
// that we instead of session.QueryOver 
// have to use detached version: QueryOver.Of 
var subquery = QueryOver.Of<House>() 
    .Where(h => h.Name == houseName) 
    // each subquery also MUST return something 
    // here the ID - house ID, to be later use for match 
    .Select(x => x.ID) 
    ; 

Room room = null; 
var query = session.QueryOver<Room>(() => room) 
    .Where(r => r.ContactPositionId == roomNumber) 
    // take rooms, which house id fits 
    .WithSubquery 
     // the room's property HouseID 
     .WhereProperty(() => room.HouseId) 
     // IS IN (...) 
     .In(subquery) 
    ; 

// later the list 
var list = query 
    .Take(10) 
    .List<Room>(); 

:

Room room = null; 
House house = null; 

var searchedRoom = session.QueryOver<Room>(() => room) 
    .JoinQueryOver<House>(r => r.House,() => house) 
    .Where(() => room.RoomNumber == roomNumber) 
    .And(() => house.Name == houseName) 
    .Take(1) 
    .List<Room>() 
    .FirstOrDefault() 
    ; 
관련 문제