NHibernate和自定义SQL子查询(使用临时表)

NHibernate和自定义SQL子查询(使用临时表),nhibernate,hql,queryover,Nhibernate,Hql,Queryover,是否可以对参数中的子查询使用自定义SQL。目前,我们成功地构建了子查询SubQueryState,但是它是一个复杂的SQL块,对于更大的数据集,它可能需要时间来处理。使用现有子查询生成查询的代码如下: session.QueryOver(() => cAlias) .WithSubquery.WhereProperty(x => x.CPE.ID).In(subQueryEstate) .JoinAlias(x => x.Costs, () => aCosts, Join

是否可以对参数中的子查询使用自定义SQL。目前,我们成功地构建了子查询SubQueryState,但是它是一个复杂的SQL块,对于更大的数据集,它可能需要时间来处理。使用现有子查询生成查询的代码如下:

session.QueryOver(() => cAlias)
.WithSubquery.WhereProperty(x => x.CPE.ID).In(subQueryEstate)
.JoinAlias(x => x.Costs, () => aCosts, JoinType.LeftOuterJoin)
.JoinAlias(x => x.Open, () => aOpen, JoinType.InnerJoin)
.List();
为了提高执行速度,我们想使用一个临时表事务生命周期来填充ID。这样做的想法是要么连接到temp表,要么使用更简单的子查询selectid FROM temp_表,而不是更复杂的原始查询

我们可以使用在NHibernate中未映射为子查询的表吗?我们可以编写自定义SQL或创建分离的条件作为参数传递给IN子句吗?我们希望保留NHibernate正在为查询的其余部分生成正确的SQL这一事实

理想的情况是:

session.QueryOver(() => cAlias)
.WithSubquery.WhereProperty(x => x.CPE.ID).In("SELECT ID FROM TEMP_TABLE")
.JoinAlias(x => x.Costs, () => aCosts, JoinType.LeftOuterJoin)
.JoinAlias(x => x.Open, () => aOpen, JoinType.InnerJoin)
.List();

想法?思想?可能有一个更优雅的解决方案我们没有考虑过。

最后我们使用临时表来解决这个问题。由于我们的应用程序使用firebird数据库,我们创建了四个具有事务生命周期的全局临时表。也就是说,临时表中的数据仅在事务的生命周期内有效

用于创建临时表的SQL注释我们创建了四个来满足我们的用例

在commit delete行上创建全局临时表TEMP_table_ID1 ID BIGINT NOT NULL; 在TEMP_TABLE_ID1ID上创建索引IDX_TEMP_TABLE_ID1

使用临时表,我们现在可以使用主查询中的ID系统地填充它们。通过使用子查询或连接到临时表来过滤后续查询,这是一种比为每个下游查询使用大型子查询快得多的方法。使用临时表可以显著提高性能,因为这些表仅在事务的生命周期内有效,这意味着我们不必担心跨事务污染和/或清除数据表

一个非常整洁的解决方案

全球临时表Firebird

我认为使用返回ID甚至完整记录的存储过程可能是最好的选择。我仍然很好奇您是如何让NHibernate映射临时表的。由于您在提交-删除行上使用,我假设您在打算在中使用它们的同一事务中创建它们?那么您是否同时在NHibernate中执行动态映射?@paligap您能解释一下您是如何将其与NHibernate连接起来的吗?我也有同样的问题?