nhibernate - QueryOver - 如何从三个表的联接中仅选择一个对象

标签 nhibernate 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
    ;

正如预期的那样,这是从所有三个连接表中选择每个属性,但实际上我只想选择汽车。 请问我该怎么做?


更新正确答案

因此,在回答之后,我不得不进行一些修改(主要是较小的语法错误),并认为我应该发布工作版本。

因为我的用户没有对汽车的直接引用,所以我必须修改别名来配合它

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
    ;

最佳答案

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>();

关于nhibernate - QueryOver - 如何从三个表的联接中仅选择一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314861/

相关文章:

nhibernate - id不在列表中的查询

c# - 使用 NHibernate 的简单获取(使用按代码映射)非常慢

NHibernate 3. QueryOver 中 "ThenFetch"的替代方案

NHibernate JoinQueryOver 返回所有子类型条目

c# - 如何使用 nHibernate 中的子集之一来过滤项目

nhibernate - 使用 nhibernate(和 queryover)急切地获取多个嵌套关联

带有 byte[] 参数的 NHibernate ISQLQuery 抛出错误

c# - NHibernate/Transaction 如何只提交一个对象而不提交整个 session

c# - NHibnerate 数据设计建议

c# - 在 Entity Framework 6 中为子集合的映射添加条件,类似于 NHibernate 的 "where"