4

バックエンド データ ストアとして SQL Server 2005 にアクセスするために NHibernate (v3.2.0.4000) を使用する大規模な ASP.NET アプリケーションがあります。複数の顧客がいて、各顧客は独自のデータベースを持っていますが、すべてのデータベースは同じサーバーで実行されています。

簡単な質問:
データベース サーバーまたは個々のデータベース自体に COLLATION を設定したり、既存の個々の NHibernate クエリ コードを書き直したりせずに、カスタム COLLATION ステートメントを NHibernate クエリに、純粋に順序付けの目的で、データベースにヒットする前に追加するにはどうすればよいでしょうか?

より長い質問:
いくつかの新しい海外の顧客がいるために、アプリケーション内でソートするためのカスタム照合をサポートする必要があります。データベース (またはサーバー) レベルでこれを行うことはできません。同じサーバー上で顧客ごとに個別のデータベースをホストしているため (顧客ごとに異なる照合要件が存在する可能性があります)、TempDB などの複雑な問題や複数の異なる照合があるためです。同じサーバー上の照合 (ここここを参照)。

コードベース全体での NHibernate の使用方法 (つまり、HQL、ICriteria、プレーン SQL、QueryOver、Linq の組み合わせ) の違いの結果として、またこれらのクエリの多くは非常に複雑で面倒なので、いずれかを変更することを完全に避けたいと考えています。既存の NHibernate クエリ コード。

SQL Server では、次のように、クエリの実行時に特定の照合順序が適用されたクエリを呼び出すことができます。 SELECT * FROM Customer ORDER BY Surname COLLATE Latin1_General_CI_AS

Interceptorまた、NHibernate では、グローバルまたはセッション固有のベースで NHibernate に追加できる を作成できることも認識しています (ここで説明されているように)。SQL ステートメントが SQL Server に送信される前にインターセプトできます。

SQLステートメントをインターセプトするインターセプタークラスを作成できるようですが、これにより、生のSQLステートメントをキャプチャすることができます(NHibernateの奇妙で素晴らしいフィールドとエイリアス名を備えています)。クエリの特定の部分 (ORDER BY 句のみが必要) をきれいに解析し、フィールドがテキストベースであり、COLLATE ステートメントを追加できます。

NHibernate.SqlCommand.ISqlStringVisitorNHibernate は、有望に聞こえ、オーバーライド可能なクラスのメソッドでSqlStringキャプチャされたもので動作するように見えるインターフェイスを公開しますが、私は NHibernate のこの部分に完全に慣れていないため、現在のところ役に立ちません。これは、NHibernate のおそらく決定的な情報源であるnhibernate.infoがダウンしています (そして、何週間も前からダウンしているようです)!OnPrepareStatementEmptyInterceptor

誰かがそのようなタスクを実行しなければなりませんでしたか? クリーンでタイプセーフな方法で NHibernate クエリを分解することは可能ですか? 同じことを達成するまったく異なるアプローチはありますか(データベース/サーバーの照合を変更できないという同じ制約がある場合)?

4

1 に答える 1