c# - 如何在 NHibernate 中创建表示两个 EXISTS 之间的 OR 的条件?

标签 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。)

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

谢谢。

最佳答案

我相信这可以解决问题:

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

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

关于c# - 如何在 NHibernate 中创建表示两个 EXISTS 之间的 OR 的条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1771740/

相关文章:

c# - 无法在 Jetbrains Rider 上运行空的 Android 应用程序

c# - 如何在日期时间选择器中选择时间

c# - 如何跟踪 Android 设备的后退按钮?

c# - Nhibernate QueryOver - 为多对多关系执行 Has All

nhibernate - 当具有相同术语的 HQL 选择有效时,为什么此 HQL 删除失败?

c# - topshelf 使用 hangfire 作为 windows 服务(.net core 2.2)

c# - 无法从程序集中加载类型

NHibernate 和拦截器 - 测量/监控 SQL 往返时间

c# - NHibernate 和 EF,在上下文之外执行查询?

NHibernate 在使用 Fetch 时返回子集合中的重复对象