2012-04-25 2 views
1

나는 이와 유사한 개체를 가지고 있다고 가정하면 세 개의 테이블을 조인 : 이제QueryOver가에서 하나의 개체를 선택하는 방법

public class User 
{ 
    public int UserId { get; set; } 
    public IList<UsersRentingLog> UsersRentLog { get; set; } 
} 

public class Car 
{ 
    public int CarId { get; set; } 
    public IList<UsersRentingLog> CarRentLog { get; set; } 
} 

public class UsersRentingLog 
{ 
    public Userid { get; set; } 
    public CarId { get; set; } 
} 

, 나는 ..

을 특정 자동차를 임대하는 모든 사용자를 선택합니다

이의 SQL은 단순히 내가 QueryOver, 자 NHibernate에서 작동이 쿼리를 얻기 위해 노력하고

select c.* 
from [User] u 
    inner join UsersRentingLog l on u.userid = l.UserId 
    inner join Car c on l.CarId = c.CarId 
where u.userid = @UserId 

것, 그리고 지금까지 내가 가지고이 :

DetachedCriteria dc = QueryOver.of<User>() 
    .where(r => r.UserId == userId) 
    .JoinQueryOver<UsersRentingLog>(l => l.UsersRentLog) 
    .JoinQueryOver<Car>(c => c.Car) 
    .DetachedCriteria 
    ; 

이것은 세 개의 조인 된 테이블의 모든 속성을 예상대로 선택하지만 실제로는 자동차 만 선택하려고합니다. 어떻게해야합니까? 정답


업데이트 그래서, 대답 후에, 나는 몇 가지 수정 (주로 사소한 구문 오류를)했습니다 내가 작업 버전을 게시 할 거라고 생각했다. 내 사용자가 자동차에 대한 직접 참조를 가지고 있지 않기 때문에

, 내가, 내가 분리 기준을 사용하고이

UsersRentingLog logAlias = null; 
var subQuery = QueryOver.of<User>() 
    .Where(user => user.UserId == userId) 
    .JoinAlias(user => user.UsersRentLog,() => logAlias) 
    .subQuery.Select(Projections.Distinct(Projections.Property(() => logAlias.Car.Id))); 


var query = _session.QueryOver<Car>(); 
    query.WithSubquery.WhereProperty(car => car.Id).In(subQuery) 
    .TransformUsing(Transformers.DistinctRootEntity) 
    .List<Car>(); 

위의 비트와 함께 갈 수있는 별칭을 수정했다, 그래서 나는 두 번째를 다시 썼다 그래서 같은 코드 블록 :

DetachedCriteria dc = QueryOver.Of<Car>() 
    .WithSubquery.WhereProperty(car => car.Id).In(subQuery) 
    .TransformUsing(new NHibernate.Transform.DistinctRootEntityResultTransformer()) 
    .DetachedCriteria 
    ; 

답변

1
Car carAlias = null; 
var subQuery = QueryOver.of<User>() 
    .Where(user => user.UserId == userId) 
    .JoinAlias(user => user.Cars,() => carAlias) 
    subQuery.Select(Projections.Distinct(
     Projections.Property(() => carAlias.Id))); 

var query = _session.QueryOver<Car>(); 
query.WithSubquery.WhereProperty(car => car.Id).In(subQuery); 
.TransformUsing(Transformers.DistinctRootEntity) 
.List<Car>(); 
+0

안녕하세요, 지금을 시도합니다, 감사합니다! – LocustHorde

+0

안녕하세요, 몇 가지 수정을해야했지만, 확실히 나를 위해 올바른 문을 열었습니다. 감사합니다. – LocustHorde

+0

이것은 슬픈 듯이 꽤 멋진 SQL을 생성하고 OP의 원본 원시 쿼리와 동일하지 않습니다. 간단한 조인 만 할 수있는 것처럼 subQuery에서 order by 절을 수행 할 수 없습니다. – rossisdead

관련 문제