2016-07-29 3 views
0

Я пытаюсь добиться следующего SQL Statement с помощью LINQ к NHibernate:NHibernate: LINQ к NHibernate я присоединиться к

SELECT a.JOB_ID ID FROM SERVICE_DATA a WHERE STEP_ID = x and (STATUS = 'Success' or STATUS = 'Skipped') 
    AND a.JOB_ID not in (SELECT JOB_ID FROM SERVICE_DATA WHERE JOB_ID = a.JOB_ID AND STATUS = 'Error') 
    AND a.JOB_ID not in (SELECT JOB_ID FROM SERVICE_DATA WHERE STEP_ID = y and (STATUS = 'Success' or STATUS = 'Skipped' or STATUS = 'Error')); 

В настоящее время я нахожусь в состоянии выбрать все ожидают, что 1-ое НЕ автообъединение состояние с помощью:

DetachedCriteria secondSubCriteria = DetachedCriteria.For<ServiceData>() 
      .SetProjection(Projections.Property("JobId")) 
      .Add(Restrictions.Eq("StepId", stepId)) 
      .Add(Restrictions.Disjunction() 
       .Add(Restrictions.Eq("Status", "Success")) 
       .Add(Restrictions.Eq("Status", "Skipped")) 
       .Add(Restrictions.Eq("Status", "Error"))); 

var data = session.CreateCriteria<ServiceData>() 
       .Add(Restrictions.Eq("StepId", stepId)) 
       .Add(Restrictions.Disjunction() 
        .Add(Restrictions.Eq("Status", "Success")) 
        .Add(Restrictions.Eq("Status", "Skipped"))) 
       //.Add(Subqueries.PropertyNotIn("JobId", ???)) 
       .Add(Subqueries.PropertyNotIn("JobId", secondSubCriteria)) 
       .List<ServiceData>() 
       .Take(1) 
       .FirstOrDefault(); 

Как я получить автообъединение на основе jOB_ID колонки работать на первых субкритериям в примере?

ответ

0

После попытки вокруг я нашел ответ сам, для тех, кто с той же проблемой указать псевдоним таблицы в Criteria() конструктор и передать в других запросах к этому.

DetachedCriteria firstSubCriteria = DetachedCriteria.For<ServiceData>("x") 
     .SetProjection(Projections.Property("x.JobId")) 
     .Add(Restrictions.EqProperty("x.JobId", "s.JobId")) 
     .Add(Restrictions.Not(Restrictions.Eq("x.Status", "Error"))); 

DetachedCriteria secondSubCriteria = DetachedCriteria.For<ServiceData>() 
     .SetProjection(Projections.Property("JobId")) 
     .Add(Restrictions.Eq("StepId", stepId)) 
     .Add(Restrictions.Disjunction() 
      .Add(Restrictions.Eq("Status", "Success")) 
      .Add(Restrictions.Eq("Status", "Skipped")) 
      .Add(Restrictions.Eq("Status", "Error"))); 

var data = session.CreateCriteria<ServiceData>("s") 
     .Add(Restrictions.Eq("StepId", stepId)) 
     .Add(Restrictions.Disjunction() 
      .Add(Restrictions.Eq("s.Status", "Success")) 
      .Add(Restrictions.Eq("s.Status", "Skipped"))) 
     .Add(Subqueries.PropertyNotIn("s.JobId", firstSubCriteria)) 
     .Add(Subqueries.PropertyNotIn("s.JobId", secondSubCriteria)) 
     .List<ServiceData>() 
     .Take(1) 
     .FirstOrDefault(); 
Смежные вопросы