2016-07-29 113 views
0

Ich versuche, die folgende SQL-Anweisung mit LINQ to NHibernate zu erreichen:NHibernate: LINQ to NHibernate selbst beitreten

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')); 

Zur Zeit alles, was ich bin in der Lage wählen Sie die ersten erwarten NICHT IN Selbst Joinbedingung mit:

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(); 

Wie kann ich die Selbst erhalte join auf der Basis der Säule JOB_ID auf den ersten Teilkriterien im Beispiel zu arbeiten?

Antwort

0

Nach dem Versuch fand ich die Antwort selbst, für jeden mit dem gleichen Problem einen Tabellenalias im Konstruktor Criteria() angeben und in den anderen Abfragen darauf verweisen.

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();