具有左外联接的复杂NHibernate准则?
我对NHibernate很陌生。我使用CreateSQLQuery编写了这篇文章,但如果可能的话,我想将其转换为NHibernate标准格式。我的查询如下所示:具有左外联接的复杂NHibernate准则?,nhibernate,subquery,left-join,Nhibernate,Subquery,Left Join,我对NHibernate很陌生。我使用CreateSQLQuery编写了这篇文章,但如果可能的话,我想将其转换为NHibernate标准格式。我的查询如下所示: select parent.ID as Id, ValueA.Total as ValueACount, ValueB.Total as ValueBCount from ParentTable parent left outer join ( select count(*) as Total, ID from ChildT
select parent.ID as Id, ValueA.Total as ValueACount, ValueB.Total as ValueBCount
from ParentTable parent
left outer join
(
select count(*) as Total, ID
from ChildTable
where state = 'ValueA'
group by ID
) ValueA on ValueA.ID = parent.ID
left outer join
(
select count(*) as Total, ID
from ChildTable
where state = 'ValueB'
group by ID
) ValueB on ValueB.ID = parent.ID
我更改了表名/值以对其进行一点抽象。代码按原样工作,但这是整个解决方案中唯一的查询。我想看看我们是否能摆脱它
提前感谢所有能提供帮助的人。如果你想给我一个链接到一个非常好的网页,可以帮助我,那也很好。我至少会给你竖起大拇指:
我也看到过一些类似的问题。如果你觉得其他一些问题/答案会对我有很大帮助,请随时告诉我。你可以试试灵芝
var results = from p in session.Query<Parent>()
select new
{
p.Id,
ValueACount = (from c1 in session.Query<Child>() where c1.State == "ValueA" && c1.Parent == p select c1).Count(),
ValueBCount = (from c2 in session.Query<Child>() where c2.State == "ValueB" && c2.Parent == p select c2).Count(),
};
或使用标准
var results = session.CreateCriteria<Parent>("p")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("Id"))
.Add(Projections.SubQuery(DetachedCriteria.For<Child>()
.Add(Restrictions.Eq("State", "ValueA") && Restrictions.EqProperty("Parent", "p"))
.SetProjection(Projections.RowCount())))
.Add(Projections.SubQuery(DetachedCriteria.For<Child>()
.Add(Restrictions.Eq("State", "ValueB") && Restrictions.EqProperty("Parent", "p"))
.SetProjection(Projections.RowCount()))))
.List();
我现在正在尝试第二件事。似乎没有结果就回来了。不知道怎么了。不管是你的代码错了,还是我把代码重新翻译成了我的类。我的课程与表格不匹配,一个字段接一个字段。然后,我创建了一些只包含必要属性的伪类,但没有效果。那没用。然而,我注意到你的代码有点问题。您有限制。EqProperty'Parent'、'p'。这些不应该是财产名称吗?即Id,Id?我假设Id是类中的一对多关联。你可以把课程贴出来让我更了解。我的代码应该模拟sql Select id,从子c1中选择Count*,其中父pI中的c1.parentId==p.id和c1.state=valueA认为EqProperty正在测试右侧的值是否等于左侧。。。这些参数在NHibernate元数据中标题为lhs和rhs。。。您似乎将它们标记为表名和别名。我误解了吗?eqproperty应该等同于EqPropertyParent.Id,p.Id,它比较两个属性,一个是对象别名,另一个是查询