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
;
嗨,现在将尝试了这一点,谢谢! – LocustHorde 2012-04-25 14:27:17
嗨,我不得不做一些修改,但它绝对为我打开了正确的大门,谢谢。 – LocustHorde 2012-04-25 15:04:42
这可悲的是会产生一些非常不好的SQL,并且与OP原始的原始查询不一样。您将无法像在子查询中那样按子句进行排序,就像您可以只进行简单连接一样。 – rossisdead 2015-05-28 20:46:44