Nhibernate 无纤维的或存在的
将以下内容转换为Sql到nhibernate时遇到问题:Nhibernate 无纤维的或存在的,nhibernate,queryover,Nhibernate,Queryover,将以下内容转换为Sql到nhibernate时遇到问题: SELECT DISTINCT Booking.* FROM Booking WHERE Booking.Status = 2 OR EXISTS (SELECT 1 FROM JourneyFuture WHERE JourneyFuture.BookingId = Booking.BookingId AND ((
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))))
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>();
以下是我到目前为止对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))))
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>();
bookingAlias=null;
var journeyFuture=QueryOver.Of()。其中(x=>x.Booking.Id==bookingAlias.Id)。
和(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)))
.选择(x=>x.Booking);
var result=session.QueryOver(()=>bookingAlias)
.Where(x=>x.Status==BookingStatusType.CancelRequested)
.WithSubquery.WhereExists(journeyFuture)
.List();
然而,这产生了一个有意义的“和”存在,但是我如何获得一个或存在
感谢您的帮助。以下几点应该有效:
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>();
bookingAlias=null;
var journeyFuture=QueryOver.Of()。其中(x=>x.Booking.Id==bookingAlias.Id)。
和(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)))
.选择(x=>x.Booking);
var result=session.QueryOver(()=>bookingAlias)
.在哪里(
限制。或(
限制。其中(()=>bookingAlias.Status==BookingStatusType.CancelRequested),
子查询.Exists(journeyFuture.DetachedCriteria)))
.List();
基本上用更强大的限制替换.WithSubquery
。或
和子查询。存在
。我希望有一种方法可以用.WithSubquery
,但我不确定是否有
一般来说,对于复杂的限制,您可以深入到
限制
类。这样做的缺点是通常会使代码更复杂。谢谢Andrew,这正是我想要的。@Paddy:没问题!很乐意帮忙!