1

ODBC 経由で OpenEdge 10.2a データベースと連携する新しい NHibernate ダイアレクトを作成しています。NHibernate 2.1 で方言を問題なく使用していますが、NHibernate 3.3.1 に移植するときに、生成されたクエリの Like ステートメントに問題があります。

NHibernate 3.3.1 で方言を使用すると、startswith("sometest") を使用した linq クエリに対して次のようなステートメントが生成されます。

select test from tests
where testname like (?||'%');
p0 = 'sometest' [Type: String (8)]

これは NHibernate 2.1 から変更されており、OpenEdge データベースはこれをサポートしていません。NHibernate 2.1 の同じクエリは次のようになります。

select test from tests
where testname like ?;
p0 = 'sometest%'

MsSql2005Dialect を使用してみました。これにより、生成された SQL が次のように少し変更されます。

select test from tests
where testname like (?+'%');
p0 = 'sometest' [Type: String (8)]

プラスになったパイプに注目してください。

これらの変更の原因は何ですか? また、NH 3.3.1 で方言を動作させるにはどうすれば変更できますか?

4

2 に答える 2

2

残念ながら、連結式を LIKE パラメータとしてサポートしていないデータベースでは、そのままでは機能しません。NH-2254を参照

回避策は、LINQ プロバイダーを拡張することです。ここにサンプルがあります

于 2012-06-14T17:08:34.933 に答える
0

この問題の回避策があります。ご存知のように、Nhibernate 用に独自の Dialectsクラスを作成できます。

私はこのプロジェクトの方言を使用しています: https://nhibernate.jira.com/browse/NH-2327

しかし、私はこの行をクラスに追加した concat 関数を変更しました:

RegisterFunction("concat", new VarArgsSQLFunction(NHibernateUtil.String, concat(", ",+", ")"));

この Like ステートメントを生成します: like concat('%'+?+'%','')

説明: OpenEdge の concat 関数は 2 つの変数しか受け入れませんが、魔法のように concat 関数内で、文字列を連結する + シグナルを受け入れます。

更新中: 私が作成したOpenEdgeDialectクラスも利用できます。

于 2013-11-07T13:50:34.153 に答える