NHibernate 2.1:别名为的子查询上的左连接(ICriteria)
我基本上是在尝试使用NHibernate ICriteria接口创建此查询: 某个表1:n另一个表 SomeTable包含列:PrimaryKey、NonagggregateColumnNHibernate 2.1:别名为的子查询上的左连接(ICriteria),nhibernate,criteria,subquery,left-join,alias,Nhibernate,Criteria,Subquery,Left Join,Alias,我基本上是在尝试使用NHibernate ICriteria接口创建此查询: 某个表1:n另一个表 SomeTable包含列:PrimaryKey、NonagggregateColumn 另一个表包含以下列:PrimaryKey、ForeignKey、另一个非聚集表、Yetanother非聚集表 SELECT table1.NonAggregateColumn, subquery.SubQueryAggregate1, subquery.SubQuery
另一个表包含以下列:PrimaryKey、ForeignKey、另一个非聚集表、Yetanother非聚集表
SELECT
table1.NonAggregateColumn,
subquery.SubQueryAggregate1,
subquery.SubQueryAggregate2
FROM
SomeTable AS table1
LEFT JOIN
(
SELECT
table2.ForeignKey,
COUNT(table2.AnotherNonAggregate) AS SubQueryAggregate1,
AVG(table2.YetAnotherNonAggregate) AS SubQueryAggregate2
FROM AnotherTable AS table2
GROUP BY (table2.ForeignKey)
) AS subquery ON subquery.ForeignKey = table1.PrimaryKey
很明显,使用投影子查询不是很有效,因为SQL必须扫描表两次(每个聚合一个投影子查询)
使用多个GROUP BY也不是很有效
有解决办法吗?到目前为止,我一直在求助于使用原始SQL,但对于复杂的报表来说,这变得越来越难操作。不幸的是,标准有点受限 试试这个:
session.CreateCriteria(typeof(SomeTable), "st")
.SetProjection( Projections.ProjectionList()
.Add(Projections.GroupProperty("st.id"))
.Add(Projections.GroupProperty("st.NonAggregateColumn"))
.Add(Projections.RowCount(), "rowcount")
.Add(Projections.Avg("at.YetAnotherNonAggregate"), "avg"));
.CreateCriteria( "st.OtherTables", "at", JoinType.InnerJoin)
.List<object[]>();
一般来说:
- 您可以使用
进行子查询。有关更多详细信息,请参阅DetachedCriteria
- 不能在where子句中使用条件和过滤器生成笛卡尔乘积。(这仅适用于HQL)
- 无法将子查询添加到from子句(因为这将导致笛卡尔乘积)。您只能将它们放在where子句中(
中,在
等)存在
- 您可能可以从另一个表开始,然后导航到某个表。这可能是另一种解决方案
select
st.id,
st.NonAggregateColumn,
count() as "rowcount",
avg(at.YetAnotherNonAggregate) as "avg"
from
SomeTable st inner join AnotherTable at on ...
group by
st.id,
st.NonAggregateColumn