나는 다음과 같은 기관NHibernate에 : 부모를 선택하고 최신 아이
public class Vehicle
{
public virtual string InternalNumber { get; set; }
public virtual IList<VehicleDriverHistory> DriverHistory { get; set; }
}
public class VehicleDriverHistory : HistoryEntity
{
public virtual Vehicle Vehicle { get; set; }
public virtual DriverPerson Driver { get; set; }
public virtual DateTime Date { get; set; }
}
가 지금은 "날짜"에 따라 존재하는 경우, 모든 차량을 선택하고 최신 VehicleDriverHistory-항목이 필요합니다. 하지만 좀 고생하고 있는데, SQL에서 문제가 없지만 지금까지는 nhibernate에서 실패했습니다. 내가 지금까지 무엇을 가지고
:
VehicleDriverHistory vdHistory = null;
VehicleDriverHistory vdHistory2 = null;
q.Left.JoinAlias(x => x.DriverHistory,() => vdHistory);
q.Left.JoinAlias(x => x.DriverHistory,() => vdHistory2).Where(x => vdHistory2.Date > vdHistory.Date);
q.Where(x => vdHistory2.Id == null);
이 작동하지 않는 NHibernate에로 (정확한 데이터를 산출) SQL 쿼리를 "번역"그냥 내 시도했다. 그래서
, (없음이 존재하지 않는 경우 또는 없음) 나는 부모와 최신 아이를 선택 얼마나
감사
UPDATE 나는 다음과 결국 Firos의 도움으로
:
VehicleDriverHistory historyAlias = null;
var maxDateQuery = QueryOver.Of<VehicleDriverHistory>()
.Where(h => h.Vehicle == historyAlias.Vehicle)
.Select(Projections.Max<VehicleDriverHistory>(h => h.Date));
var vehiclesWithEntry = DataSession.Current.QueryOver(() => historyAlias)
.WithSubquery.WhereProperty(h => h.Date).Eq(maxDateQuery)
.Fetch(h => h.Vehicle).Eager
.Future();
Vehicle VehicleAlias = null;
var vehiclesWithoutEntry = DataSession.Current.QueryOver<Vehicle>(() => VehicleAlias)
.WithSubquery
.WhereNotExists(QueryOver.Of<VehicleDriverHistory>()
.Where(x => x.Vehicle.Id == VehicleAlias.Id).Select(x => x.Id))
.Future();
return vehiclesWithEntry.Select(h => new PairDTO { Vehicle = h.Vehicle, NewestHistoryEntry = h }).Concat(vehiclesWithoutEntry.Select(v => new PairDTO { Vehicle = v })).ToList();
vehulesWithoutEntry의 Any() 문을 하위 쿼리 절로 대체해야했기 때문에 예외가 발생했다.
당신은 당신이 원하는 SQL을 게시 할 수 시도해 볼 수도 있습니다 '최근 날짜'라고 말한 것처럼 질의를 컴파일하는데 도움이되지만'vdHistory2.Date> vdHistory.Date'가 있습니다. – Rippo
번역을 시도한 쿼리입니다. 는' 차량 LEFT OUTER로부터 * 를 선택) vdh2 ON vdh2 그대로 VehicleDriverHistories 가입 vdh1.vdh_vehicleId = vehicles.BVE_Id LEFT OUTER ON vdh1 AS VehicleDriverHistories 가입하세요, 당신은 다른 suggesstion이있는 경우 그러나, 단지 그것을 게시 할 수 있습니다. vdh_vehicleId = 차량 .BVE_Id AND vdh2.vdh_date> vdh1.vdh_date 여기서 vdh2.vdh_vehicleId는 null입니다. ' – Arikael