c# - Fluent NHibernate QueryOver 选择不在另一个表中的项目(左连接)

标签 c# nhibernate subquery fluent-nhibernate left-join

我有两个表:

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

隐藏: 编号 | propA |支持B

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

我想从第一个表中获取所有行,减去任何匹配 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 映射的关系,就不可能创建连接。 看这个answer .

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

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

关于c# - Fluent NHibernate QueryOver 选择不在另一个表中的项目(左连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44904844/

相关文章:

sql - 正确使用联接

NHibernate QueryOver SQLFunction in where 子句

c# - 如何以编程方式保存用户设置?

c# - 使用通用存储库更新实体失败

c# - 如何在 C# 命令中使用 LIKE 运算符?

c# - NHibernate OleDB : Invalid program bind when using session. get<T>(id)

NHibernate:有时我想要一个项目,有时我想要它们

c# - 在表达式树中显式转换?

c# - 如何限制 NHibernate 的 GetByCriteria 拉回的结果集?

mysql - 在父数据库搜索中连接多个子记录