1

Im пытается воспроизвести следующий SQL в NHibernate ICriteriaNhibernate Характеристики внутреннего соединения подзапросов

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) 

До сих пор я удалось получить следующее (Примечание: я гавань профилированный так им не совсем уверен, насколько похожи 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()); 

Uppdate: есть некоторые новые данные и переработан СКП немного. Uppdate: Получил полурабочий подзапрос, необходимо выяснить, как правильно установить его upp.

+0

Do * not * обновите * вопрос * с ответом *, отправьте ответ и * в ответ * опубликуйте решение. Я вернул ваши изменения, потому что при обновлении вашего вопроса вы отменили ответ ниже, и ваш * ответ * не является ответом, он просто говорит «эй, я исправил его, посмотрю там». Пожалуйста, старайтесь соблюдать это в будущем. – casperOne

ответ

5

Наконец получил его работу и обновил свой код критерии с окончательной рабочей версией в моем случае. Я не знаю точно, насколько близко это относится к моему исходному коду 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()); 
1

Вы не можете использовать критерии при выборе в предложении from. Либо попробуйте HQL или фильтр на стороне клиента

Update:

.Add(Restrictions.EqProperty("OrderReference.ID", "OP.ID")) 
// or 
.Add(Restrictions.EqProperty("OrderReference", "OP")) 
+0

Я не уверен, что я сделал какой-либо прогресс в этом, но я сделал что-то похожее, что это может сработать, если я смогу выяснить, как его настроить. – Azazel

Смежные вопросы