4

У меня есть один вопрос, чтобы спросить вас, дорогая община, как вы, возможно, догадались. Так. Я хочу, чтобы NHibernate отфильтровывал результаты запроса, основываясь на оценке табличной функции sql. Возможные SQL-запрос генерируется NHibernate может выглядеть следующим:Могу ли я использовать табличную функцию как источник запроса в 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 
    ) 

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

ответ

0

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

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

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

0

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