Это заняло у меня некоторое время, но я понял, как получить то, что я хочу - в основном.Мой код:
var sq = QueryOver.Of<VehicleGroup>(() => vehicleGroup)
.JoinQueryOver<Manager>(vg => vg.Managers)
.Where(man => man.Id == managerId)
.JoinQueryOver<TruckPCBase>(() => vehicleGroup.Vehicles)
.Where(v => v.Id == item.VehicleId)
.Select(vg => vg.Id)
;
var vp = Session.QueryOver<Summary>(() => item)
.WithSubquery.WhereExists(sq)
.Take(10)
.List();
Это возвращает именно то, что я хочу.
ОДНАКО, мне пришлось сопоставить дополнительное поле, чтобы оно работало.Компонент VehicleBase.Я хотел сделать следующее:
var sq = QueryOver.Of<VehicleGroup>(() => vehicleGroup)
.JoinQueryOver<Manager>(vg => vg.Managers)
.Where(man => man.Id == managerId)
.JoinQueryOver<TruckPCBase>(() => vehicleGroup.Vehicles)
.Where(v => v.Id == item.VehicleBase.Id)
.Select(vg => vg.Id)
;
var vp = Session.QueryOver<Summary>(() => item)
.WithSubquery.WhereExists(sq)
.Take(10)
.List();
Это дает следующую ошибку:
System.NullReferenceException: Object reference not set to an instance of an object.
at lambda_method(ExecutionScope )
Хорошо, поэтому я добавил дополнительную выборку:
var sq = QueryOver.Of<VehicleGroup>(() => vehicleGroup)
.JoinQueryOver<Manager>(vg => vg.Managers)
.Where(man => man.Id == managerId)
.JoinQueryOver<TruckPCBase>(() => vehicleGroup.Vehicles)
.Where(v => v.Id == item.VehicleBase.Id)
.Select(vg => vg.Id)
;
var vp = Session.QueryOver<Summary>(() => item)
.Fetch(sum => sum.VehicleBase).Eager
.WithSubquery.WhereExists(sq)
.Take(10)
.List();
Нетигральная кость.Я не хочу добавлять новое свойство в мой класс Summary (VehicleId) - я хочу получить к нему доступ через Summary.VehicleBase.Id
Предложения?