与 NHibernate 和标准联合?

Posted

技术标签:

【中文标题】与 NHibernate 和标准联合?【英文标题】:Union with NHibernate and Criteria? 【发布时间】:2011-12-21 14:15:03 【问题描述】:

与 NHibernate 和 Criteria 联合:

是否可以在 Criteria 或 QueryOver 中使用? 如果没有,有没有其他方法可以在同一个查询中实现两个结果的联合?

【问题讨论】:

【参考方案1】:

你不能直接做一个联合,但你可以做两个未来的查询,并在代码中联合结果:

var resultSet1 = this.Session.CreateCriteria<A>().Future<A>();
var resultSet2 = this.Session.CreateCriteria<B>().Future<B>();

之后,当枚举任一结果集时,NHibernate 将向数据库发出单个查询,该查询将返回多个结果集。注意,如果你没有使用 SQL Server,数据库可能不支持多个结果集。

【讨论】:

【参考方案2】:

即使使用 HQL,这也是不可能的。见其他 S.O. post

一种方法是退回到原始 SQL 并使用命名查询

<sql-query name="MyQuery">
<![CDATA[
select col1,col2 from table1
union
select col1,colA from table2
]]>
</sql-query>

并使用 AliasToBeanResultTransformer 将其转换回您的 DTO/POCO

var query = Session
  .GetNamedQuery("MyQuery")
  .SetResultTransformer(new AliasToBeanResultTransformer(typeof(MyDto)));
  return query.List<MyDto>();

【讨论】:

很遗憾,这不是一个选项,因为列可能会有所不同。不过感谢您的提示! +1【参考方案3】:

你可以使用 -

NHibernate.Criterion.Restrictions.Or(ICriterion FirstQuery,
                                     ICriterion SecondQuery)

作为您在单个查询中的条件。

【讨论】:

我早上试试这个然后回复你 这也有效,但是由于我对基类和我加入的交叉表执行 OR 子句(我应该在问题中解释),因此生成的查询会产生显着的性能惩罚。不过感谢您的回答。 +1

以上是关于与 NHibernate 和标准联合?的主要内容,如果未能解决你的问题,请参考以下文章

NHIbernate 和安全/业务层

如果我使用类似 NHibernate 的 ORM,为啥需要 LINQ?

使用 NHibernate 的示例查询

Abp.NHibernate连接PostgreSQl数据库

如何使用 NHibernate 联合子类映射抽象属性?

使用 NHibernate 将聚合与实体一起投影