Aza*_*zel 1 sql subquery icriteria fluent-nhibernate nhibernate-criteria
我试图在Nhibernate ICriteria中复制以下sql
SELECT DISTINCT AP.ID
FROM ActivityParts AP
INNER JOIN ActivityBookings AB ON AB.ActivityPartID = AP.ID
INNER JOIN OrderPartBookings OPB ON OPB.ActivityBookingID = AB.ID
INNER JOIN OrderParts OP ON OP.ID = OPB.OrderPartID
INNER JOIN Orders O ON O.ID = OP.OrderID
LEFT JOIN Invoices I ON I.ID = (SELECT TOP 1 ID FROM Invoices WHERE OrderReferenceID = OP.ID AND Cancelled = 0 ORDER BY Created DESC)
WHERE
O.OrderStatus != 'Cancelled'
AND OP.Payed = 0
AND (I.ID IS NOT NULL AND DATEADD(Day,1, I.DueDate) < @date)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经设法得到以下(注意:我没有描述它所以我不太确定sql如何通过标准变得类似):
var invoiceSubCrit = DetachedCriteria.For<Invoice>()
.Add(Restrictions.Eq("Cancelled", false))
.Add(Restrictions.EqProperty("OrderReference", "OP.ID"))
.AddOrder(NhOrder.Desc("Created"))
.SetProjection(Projections.Property("DueDate"))
.SetMaxResults(1);
var crit = Session.CreateCriteria<OrderPart>("OP")
.CreateCriteria("OP.Bookings", "AB", JoinType.InnerJoin)
.CreateCriteria("OP.Order", "O", JoinType.InnerJoin)
.CreateCriteria("AB.ActivityPart", "AP", JoinType.InnerJoin)
.Add(NhExpression.Eq("AP.ID", ActivityID))
.Add(NhExpression.Eq("OP.Payed", false))
.Add(NhExpression.Not(NhExpression.Eq("O.OrderStatus", OrderStatus.Cancelled)))
.Add(NhExpression.Not(NhExpression.Eq("AB.Status", QueueStatus.Reserve)))
.Add(Subqueries.Lt(DateTime.Now.Date.AddDays(1), invoiceSubCrit))
.SetResultTransformer(new DistinctRootEntityResultTransformer());
Run Code Online (Sandbox Code Playgroud)
Uppdate: 获得了一些新信息,并对sql进行了一些重构. Uppdate:有一个半工作子查询,需要弄清楚如何正确设置它.
最后让它工作,并在我的案例中更新了我的标准代码与最终工作版本.我不知道这与我原来的SQL代码究竟有多接近,但结果是相同的,这是最重要的.
var invoiceSubCrit = DetachedCriteria.For<Invoice>()
.Add(Restrictions.Eq("Cancelled", false))
.Add(Restrictions.EqProperty("OrderReference.ID", "OP.ID"))
.AddOrder(NhOrder.Desc("Created"))
.SetProjection(Projections.Property("DueDate"))
.SetMaxResults(1);
var crit = Session.CreateCriteria<OrderPart>("OP")
.CreateCriteria("OP.Bookings", "AB", JoinType.InnerJoin)
.CreateCriteria("OP.Order", "O", JoinType.InnerJoin)
.CreateCriteria("AB.ActivityPart", "AP", JoinType.InnerJoin)
.Add(NhExpression.Eq("AP.ID", ActivityID))
.Add(NhExpression.Eq("OP.Payed", false))
.Add(NhExpression.Not(NhExpression.Eq("O.OrderStatus", OrderStatus.Cancelled)))
.Add(NhExpression.Not(NhExpression.Eq("AB.Status", QueueStatus.Reserve)))
.Add(Subqueries.Gt(DateTime.Now.Date, invoiceSubCrit))
.SetResultTransformer(new DistinctRootEntityResultTransformer());
Run Code Online (Sandbox Code Playgroud)