Fluent NHibernate QueryOver 到 select 项不在另一个 table 中(左连接)

Fluent NHibernate QueryOver to select items not in another table (left join)

我有两个 table:

全部: 编号 | propA |支持B |一些其他列

隐藏: 编号 | propA | propB

和相应的类(已映射,尚未映射关系)

我想获取第一个 table 的所有行,减去匹配 propApropB 的任何结果 属性.

我设法通过 Criteria API 做到了,但想看看它是如何用 QueryOver API 完成的,如果可能的话,没有子查询,但有一个 left excluding join。

条件版本:

var dc1 = DetachedCriteria.For<hidden>()
    .Add(Restrictions.IsNotNull(Projections.Property("propA")))
    .SetProjection(Projections.Property("propA"));

var dc2 = DetachedCriteria.For<hidden>()
    .Add(Restrictions.IsNotNull(Projections.Property("propB")))
    .SetProjection(Projections.Property("propB"));



var query = db
    .CreateCriteria<all>()
    .Add(Restrictions.On<all>(c => c.someOtherColumn).IsLike("1"))
    .Add(Subqueries.PropertyNotIn("propA", dc1))
    .Add(Subqueries.PropertyNotIn("propB", dc2))

大致给出:

SELECT all.* 
FROM all
WHERE (all.someOtherColumn LIKE '1')
    and all.propA not in (SELECT hidden.propA FROM hidden WHERE hidden.propA IS NOT NULL) 
    and all.propB not in (SELECT hidden.propB FROM hidden WHERE hidden.propB IS NOT NULL)

没关系,虽然从性能上看这会更好:

SELECT all.* 
FROM all
LEFT JOIN hidden ON all.propA = hidden.propA
LEFT JOIN hidden ON all.propB = hidden.propB
WHERE hidden.propA IS NULL
AND hidden.propB IS NULL 
AND (all.someOtherColumn LIKE '1')

如果无法生成具有未映射关系的语句,我愿意接受有关映射的建议。

在我看来,如果没有映射关系,则无法通过 QueryOver 创建联接。 看到这个 .

使用子查询你可以这样做:

All allAlias = null;
var result = Session.QueryOver(() => allAlias)
               .WhereRestrictionOn(x => x.someOtherColumn).IsLike('1')
               .WithSubquery.WhereNotExists(QueryOver.Of<hidden>()
                     .Where(h => h.propA == allAlias.propB || h.propB == allAlias.propB)
                     .Select(h => h.Id))
               .List();