2012-04-25 84 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都仅仅是

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 

我试图让这个查询在QueryOver,NHibernate的工作,到目前为止,我有这样的:

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

这是按预期方式从所有三个连接表中选择每个属性,但我实际上只想选择Cars。 我该怎么做?


更新的正确答案

,则回答后,我不得不做出一些修改(主要是小的语法错误),我想我会发布的工作版本。

因为我的用户没有直接引用的车,我不得不修改别名与此

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 2012-04-25 14:27:17

+0

嗨,我不得不做一些修改,但它绝对为我打开了正确的大门,谢谢。 – LocustHorde 2012-04-25 15:04:42

+0

这可悲的是会产生一些非常不好的SQL,并且与OP原始的原始查询不一样。您将无法像在子查询中那样按子句进行排序,就像您可以只进行简单连接一样。 – rossisdead 2015-05-28 20:46:44

相关问题