簡體   English   中英

NHibernate:LINQ to NHibernate自加入

[英]NHibernate: LINQ to NHibernate self join

我正在嘗試使用LINQ to NHibernate實現以下SQL語句:

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

目前,我可以使用以下命令選擇所有需要第一個NOT IN自我加入條件的條件:

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獲得自我聯接以在示例中的第一個子條件上工作?

經過嘗試后,我自己找到了答案,對於有相同問題的任何人,請在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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM