如何在NHibernate中创建一个表示两个EXISTS之间OR的标准?

时间:2009-11-20 16:47:53

标签: c# nhibernate

这个让我头疼(这很简单,因为我是NHibernate的新手):我如何通过Criteria API表示以下查询(T-SQL)?

DECLARE @pcode VARCHAR(8)
SET @pcode = 'somecode'

SELECT d.*
FROM document d
WHERE EXISTS (
          SELECT 1 
          FROM project p 
          WHERE p.id = d.projectId AND p.code = @pcode)
      OR EXISTS (
          SELECT 1 
          FROM job j INNER JOIN project p ON p.id = j.projectId
          WHERE j.id = d.jobId AND p.code = @pcode)

(文档有两个可能的关联,项目或作业。在给定时间只有一个具有值;另一个具有null。)

目标是加载与给定项目直接关联的所有文档或通过作业间接加载。

感谢。

1 个答案:

答案 0 :(得分:2)

我相信这可以解决问题:

DetachedCriteria dCriteria1 = DetachedCriteria.For<Project>("project")
        .SetProjection(Projections.Property("project.Id"))
        .Add(Restrictions.EqProperty("doc.projectId", "project.Id"));

DetachedCriteria dCriteria2 = DetachedCriteria.For<Job>("job")
           .SetProjection(Projections.Property("job.Id"))   
           .CreateCriteria("Projects", "p")
           .Add(Restrictions.EqProperty("doc.jobId", "job.Id"))
           .Add(Restrictions.Eq("p.code", "somecode"));

var documents = NHibernateSessionManager.Session.CreateCriteria<Document>("doc")
        .Add(Restrictions.Or(
            Subqueries.Exists(dCriteria1),
            Subqueries.Exists(dCriteria2))).List<Document>();

以上代码源自您提供的示例查询。如果它不完全准确,您可以稍微更改它以使其在您的解决方案中可行。