Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate 2.1:别名为的子查询上的左连接(ICriteria)_Nhibernate_Criteria_Subquery_Left Join_Alias - Fatal编程技术网

NHibernate 2.1:别名为的子查询上的左连接(ICriteria)

NHibernate 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

我基本上是在尝试使用NHibernate ICriteria接口创建此查询:

某个表1:n另一个表

SomeTable包含列:PrimaryKey、NonagggregateColumn
另一个表包含以下列: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子句中(
    中,
    存在
    等)
  • 您可能可以从另一个表开始,然后导航到某个表。这可能是另一种解决方案

你能澄清你的问题吗?显示的查询是本机sql。它是否已返回预期的数据?您希望将其转换为标准。为什么不使用HQL?忘了提一下:您正在使用ORM。因此,要编写查询,您不必太在意表和外键。更重要的是实体和映射定义。那么这些表是如何映射的呢?表格里有列表吗?另一张表中有参考资料吗?或者两者都有?是的,原始查询返回报表所需的数据。我使用的是NHibernate2.1。CriteriaAPI是首选的,因为通过NHLambdaExtensions(我也在使用它)具有强大的类型化能力。我使用SomeTable和AnotherTable的名称是为了使SQL清晰易读。它是真实物体的虚拟镜像。SomeTable映射对象具有一对多的其他对象的反向集合。没有人有任何想法吗?以前没有人尝试过这个?你能发布这个查询的条件和/或HQL代码吗?我非常希望看到它(即使它的表现很差)。谢谢我知道分组解决方案,但问题是,在现实世界的报告中,我需要按如此多的列分组,SQL将大大降低1000条记录的速度,哦,好吧,也许我可以尝试研究NHibernate的源代码,并有一天对此作出贡献。。。现在我将使用原始SQL,谢谢您的帮助。
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