4

親愛なるコミュニティの皆さん、ご想像のとおり、1 つ質問があります。そう。テーブル値の SQL 関数の評価に基づいて、NHibernate にクエリの結果をフィルター処理してもらいたいです。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 に何をどのように参加させるべきかを伝える方法はありません。したがって、存在する可能性のある 1 つの解決策は 2 番目の解決策です。
残念ながら、テーブル値関数を相関サブクエリのクエリ ソースとして使用する方法を見つけることができなかったのは幸運でした。それを手伝ってくれませんか?

4

2 に答える 2

0

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

于 2011-06-15T07:48:40.530 に答える
0

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

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

後者の場合、はい、EXISTSおそらく進むべき道です。条件全体 (EXISTS を含む) を SQLCriterion で囲むことができます。

于 2010-11-23T01:26:39.737 に答える