문제

I am having trouble converting the following to Sql to nhibernate:

SELECT DISTINCT Booking.*
FROM   Booking WHERE  Booking.Status = 2
            OR EXISTS (SELECT 1
            FROM   JourneyFuture
            WHERE  JourneyFuture.BookingId = Booking.BookingId
                    AND ((JourneyFuture.[IsDriverAssigned] = 0
                        AND JourneyFuture.[Status] = 1) -- live
                        OR JourneyFuture.[Status] = 2
                        OR JourneyFuture.[Status] = 4
                        OR (JourneyFuture.[Status] = 1
                            AND (JourneyFuture.IsMetricCalculated = 0
                                    OR JourneyFuture.Duration = 0
                                    OR JourneyFuture.Distance = 0))))

Here is what I have so far with Nhibernate:

Booking bookingAlias = null;    
var journeyFuture = QueryOver.Of<JourneyFuture>().Where(x=> x.Booking.Id==bookingAlias.Id).
                    And(x => (!x.IsDriverAssigned && x.Status==JourneyStatusType.Live) || x.Status==JourneyStatusType.CancelRequested
                                || x.Status == JourneyStatusType.Modified || 
                                (x.Status == JourneyStatusType.Live && (!x.IsMetricCalculated || x.Duration==0 || x.Distance==0)))
                                .Select(x=> x.Booking);

                var result = session.QueryOver<Booking>(() => bookingAlias)
                    .Where(x => x.Status == BookingStatusType.CancelRequested)
                    .WithSubquery.WhereExists(journeyFuture)
                    .List<Booking>();

This however is producing an "And" exists which makes sense, but how do I get an OR EXISTS?

Any help appreciated.

도움이 되었습니까?

해결책

The following should work:

Booking bookingAlias = null;    
var journeyFuture = QueryOver.Of<JourneyFuture>().Where(x=> x.Booking.Id==bookingAlias.Id).
    And(x => (!x.IsDriverAssigned && x.Status==JourneyStatusType.Live) || x.Status==JourneyStatusType.CancelRequested
                || x.Status == JourneyStatusType.Modified || 
                (x.Status == JourneyStatusType.Live && (!x.IsMetricCalculated || x.Duration==0 || x.Distance==0)))
                .Select(x=> x.Booking);

var result = session.QueryOver<Booking>(() => bookingAlias)
    .Where(
        Restrictions.Or(
            Restrictions.Where(() => bookingAlias.Status == BookingStatusType.CancelRequested),
            Subqueries.Exists(journeyFuture.DetachedCriteria)))
    .List<Booking>();

Basically replace .WithSubquery with the more powerful Restrictions.Or and Subqueries.Exists. I wish there was a way to do this with .WithSubquery, but I'm not sure there is.

In general, with complex restrictions, you can dip down into the Restrictions class. The downside to this is that it usually makes your code more complex.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top