我可以在NHibernate中使用表值函数作为查询源吗?

时间:2010-11-22 20:23:59

标签: nhibernate criteria-api user-defined-functions correlated-subquery

亲爱的社区,我有一个问题要问你,你可能已经猜到了。所以。 我希望NHibernate基于对表值sql函数的评估来过滤查询结果。 NHibernate生成的可能的SQL查询可能类似于以下内容:

SELECT
   [whatever]
FROM
   [whatever]
   INNER JOIN dbo.FnMyTableValuedFunction() as MyAlias ON
       [whatever].FirstDesiredKey = MyAlias.FirstDesiredKey
       AND
       [whatever].SecondDesiredKey = MyAlias.SecondDesiredKey

或者可以这样写:

SELECT
    [whatever]
FROM
    [whatever]
WHERE
    EXISTS(
        SELECT
            1
        FROM
            dbo.FnMyTableValuedFunction() AS MyAlias
        WHERE
            [whatever].FirstDesiredKey = MyAlias.FirstDesiredKey
            AND
            [whatever].SecondDesiredKey = MyAlias.SecondDesiredKey
    )

我想使用Criteria API生成此类查询。 据我所知,没有办法告诉NHibernate它应该加入什么以及如何加入。因此,可能存在的一个解决方案是第二个解决方案 不幸的是,我没有幸运地找到如何使用表值函数作为相关子查询的查询源。你能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

除SQL(HQL,Criteria,Linq,QueryOver)之外的所有NHibernate查询方法都适用于实体,而不是表或任何其他数据库工件。

因此,如果您正在使用Criteria,则需要将FnMyTableValuedFunction映射到实体,或使用SQLCriterion作为任意SQL块。

对于后者,是的,EXISTS可能是要走的路。您可以将整个条件(包括EXISTS)括在SQLCriterion中。

答案 1 :(得分:0)

您可以将自定义方法添加到派生的SQLDialect中,并在条件中使用它,查看所有Dialects继承的NHibernate.Dialect.Dialect中的RegisterFunction