2

私がこれに似たオブジェクトを持っていると仮定します:

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
    ;

これは、予想どおり、結合された3つのテーブルすべてからすべてのプロパティを選択していますが、実際には車のみを選択したいと思います。どうすればこれを行うことができますか?


正解を更新

そのため、回答後、いくつかの変更を加える必要があり(ほとんどの場合、マイナーな構文エラー)、作業バージョンを投稿すると思いました。

私のユーザーは車への直接の参照を持っていないので、これに合わせてエイリアスを変更する必要がありました

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

上記のビットでは、切り離された基準を使用しているので、2番目のコードブロックを次のように書き直しました。

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

1 に答える 1

2
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>();
于 2012-04-25T14:15:48.427 に答える