NHibernate Left Join with condition or null

标签 nhibernate

我有 2 个对象,ProjectUsageLast30 一对一映射。

我正在尝试查询还没有 UsageLast30 或具有日期属性在阈值之前的 UsageLast30 的所有项目。

如果我使用查询,我会得到一个空引用异常:

session.QueryOver<Project>(() => p)
    .Left.JoinAlias(() => p.UsageLast30, () => u)
    .Where(() => u == null || u.LastCalculated < threshold)

以下备选方案运行,但不会产生我期望的 SQL。

session.QueryOver<Project>(() => p)
    .Left.JoinAlias(() => p.UsageLast30, () => u)
    .Where(Restrictions.Or(
        Restrictions.Where<Project>(x => x.UsageLast30 == null),
        Restrictions.Where(() => u.LastCalculated < threshold)
    ))

这给出了一个 WHERE 条件:

WHERE  (this_.project_id is null
     or u1_.last_calculated < '2015-09-08T18:18:51' /* @p0 */)

null 测试在 Project 上进行,而不是像我预期的那样在 UsageLast30 上进行。

我如何构建这个查询?

映射如下:

<class name="Analytics.Core.Project" table="project">
    <id name="Id" column="project_id">
      <generator class="identity" />
    </id>
    <!-- ... -->
    <one-to-one name="UsageLast30" constrained="false" foreign-key="none" />
</class>

<class name="Analytics.Core.ProjectUsageLast30" table="project_usage30">
    <id name="ProjectId" column="project_id">
        <generator class="foreign">
            <param name="property">Project</param>
        </generator>
    </id>
    <!-- ... -->
    <one-to-one name="Project" constrained="true" />
</class>

最佳答案

我仍然不知道为什么在 p.UsageLast30 上测试 null 会生成错误的 null 测试,而是测试 null property 而不是 null object 给出正确的 SQL 查询。例如:

session.QueryOver<Project>(() => p)
    .Left.JoinAlias(() => p.UsageLast30, () => u)
    .Where(() => u.LastCalculated == null || u.LastCalculated < threshold)

注意 u.LastCalculated == nullu == null

的比较

关于NHibernate Left Join with condition or null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34140800/

相关文章:

sql - NHibernate LINQ BIGINT 类型转换

c# - 是否可以使用 FluentNHibernate 将具有空格的 varchar 映射到枚举

nhibernate - 在NHibernate中强制执行急切的选择

c# - 将 CaSTLe ActiveRecord 与 Fluent NHibernate 结合使用?

c# - 使用 Nhibernate Criteria Api 查询集合?

nhibernate - ORM 和多对多关系

NHibernate 使用 SysCache 跨 session 缓存实体

javascript - 有没有办法在 Bootstrap 模式中使用 Bootstrap 弹出窗口?

nHibernate 连接多个表并使用 AliasToBean 转换器

.net - 如何使 NHibernate 缓存获取的子集合?