4

私はあなたが推測しているように、貴重なコミュニティにお尋ねする質問が1つあります。そう。 NHibernateは、テーブル値のSQL関数の評価に基づくクエリの結果をフィルタリングします。 NHibernateはによって生成された 可能な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を使用して生成します。 私が知る限り、NHibernateに参加する方法とその方法を伝える方法はありません。したがって、存在するかもしれない1つの解決法が第2の解決策である。
残念ながら、相関サブクエリのクエリソースとしてテーブル値関数を使用する方法を知ることはできませんでした。あなたはそれで私を助けることができますか?

答えて

0

SQL(HQL、Criteria、Linq、QueryOver)以外のすべてのNHibernateクエリメソッドは、テーブルやその他のDBアーティファクトではなく、エンティティで機能します。

したがって、Criteriaを使用している場合は、FnMyTableValuedFunctionをエンティティにマップするか、任意のSQLブロックにSQLCriterionを使用する必要があります。

後者では、はい、EXISTSはおそらく行く方法です。条件(EXISTSを含む)全体をSQLCriterionに囲むことができます。

0

派生したSQLDialectにカスタムメソッドを追加して、それを条件で使用し、すべてのDialectが継承するNHibernate.Dialect.DialectのRegisterFunctionを調べることができます。

関連する問題