Nhibernate 带条件的嵌套选择计数查询

Nhibernate 带条件的嵌套选择计数查询,nhibernate,count,criteria,Nhibernate,Count,Criteria,假设我们有两个实体EntityA和EntityB,以及相关的表TableA和TableB 我必须实现这个查询: select a.Id , (select count(b.Id) from TableB b where b.FKa = a.Id and b.AnotherField > 0) as TheCount from TableA a 自从我写了这段代码后,我就非常接近这一点: var subCrit = DetachedCriteria.For<EntityB>

假设我们有两个实体EntityA和EntityB,以及相关的表TableA和TableB

我必须实现这个查询:

select a.Id , (select count(b.Id) from TableB b where b.FKa = a.Id and b.AnotherField > 0) as TheCount
from TableA a 
自从我写了这段代码后,我就非常接近这一点:

var subCrit = DetachedCriteria.For<EntityB>
                                        .Add<EntityB>(e => e.AnotherField > 0)
                                        .SetProjection(LambdaProjection.Count<EntityB>(e => e.Id).As("TheCount"));

var crit = Session.CreateCriteria<EntityA>
                        .SetProjection(LambdaProjection.GroupProperty<EntityA>(e => e.Id).As("Id),
                                            Projections.SubQuery(subCrit));
正如你所看到的,这非常接近我试图实现的目标……问题(这确实是一个大问题:D) 子查询和TableA的实体之间没有链接(其中b.FKa=a.Id)。 我找不到通过条件将子查询与外部查询关联起来的方法

有什么建议吗

太多了

亚历山德罗

enter code here
编辑:

改变观点,我也可以这样做:

 var crit = Session.CreateCriteria<EntityA>()
                   .CreateAlias<EntityB>(a => a.B, () => b);
                   .SetProjection(LambdaProjection.Count<A>(a => b.Id).As("TheCount"),
                   .SetProjection(LambdaProjection.GroupProperty<EntityA>(a => a.Id));
但是在这里你可以看到,额外的where子句b.AnotherField>0丢失了,我不知道如何插入它只是为了计数


希望清楚,再次感谢

我的建议是更改SQL语句

选择a.is,计数(a.id) 从表a 在a.id=b.fka和b.af>0时联接表b 按a.ID分组

并创建简单的标准。

以下是解决方案:

var condition = Expression.Gt("b.AnotherField",0);
var conditionalProjection = Projections.Conditional(condition, Projections.Constant(1), Projections.Constant(0));

crit = Session.CreateCriteria<EntityA>()
                   .CreateAlias<EntityB>(a => a.B, () => b);
                   .SetProjection(Projections.Count(conditionalProjection).As("TheCount"),
                     (LambdaProjection.GroupProperty<EntityA>(a => a.Id));

你考虑过使用nHibernate包吗?它们是nHibernate处理外键的方式。我想我应该发布完整的场景。无论如何,我不能将包用于域约束,我知道这是一个非常扭曲的场景,但这正是我必须实现的。用另一种可能的场景编辑了主帖不幸的是,我不能按照你的建议更改sql语句,因为在同一个sql语句中,我必须返回表a的所有行,不仅仅是那些有额外where子句的行,同时我必须只计算满足where子句的行。这就是count.not.的子查询的原因,因为如果将限制添加到别名b,则该限制将添加到where子句中。。我想要的是有一个条件计数……幸运的是我找到了有效的解决方案:)我会在几分钟后发布它
var condition = Expression.Gt("b.AnotherField",0);
var conditionalProjection = Projections.Conditional(condition, Projections.Constant(1), Projections.Constant(0));

crit = Session.CreateCriteria<EntityA>()
                   .CreateAlias<EntityB>(a => a.B, () => b);
                   .SetProjection(Projections.Count(conditionalProjection).As("TheCount"),
                     (LambdaProjection.GroupProperty<EntityA>(a => a.Id));
enter code here