Могу ли я использовать табличную функцию в качестве источника запроса в NHibernate? - PullRequest
4 голосов
/ 22 ноября 2010

У меня есть один вопрос к вам, дорогая община, как вы уже догадались.Так.Я хочу, чтобы NHibernate отфильтровал результаты запроса на основе оценки табличной функции sql.Возможный SQL-запрос, сгенерированный NHibernate, может выглядеть примерно так:

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
    )

Такой запрос я хочу сгенерировать с помощью API Criteria.Насколько я знаю, нет никакого способа сказать NHibernate, к чему он должен присоединиться и как.Таким образом, единственное решение, которое может существовать, это второе.К сожалению, мне не повезло узнать, как использовать табличную функцию в качестве источника запроса для коррелированного подзапроса.Вы можете помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

Возможно, вы сможете добавить пользовательский метод в производный SQLDialect и использовать его в критериях, посмотрите на RegisterFunction в NHibernate.Dialect.Dialect, который наследуют все диалекты.

0 голосов
/ 23 ноября 2010

Все методы запросов NHibernate, кроме SQL (HQL, Criteria, Linq, QueryOver), работают с сущностями, а не с таблицами или другими артефактами БД.

Поэтому, если вы используете Criteria, вам нужно либо сопоставить FnMyTableValuedFunction для сущности или используйте SQLCriterion для произвольного блока SQL.

С последним, да, EXISTS, вероятно, является подходящим способом.Вы можете просто заключить все условие (включая EXISTS) в SQLCriterion.

...