gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:40:02 26 4
gpt4 key购买 nike

我有两个表:

全部:编号 | 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com