MySQL から Postgres に変換していますが、一部の linq クエリで例外が発生します。具体的には、ビットごとの演算子の比較を追加するクエリで問題が発生します。SQL 文字列のパラメーターが、名前付き (:p1、:p2、:p3) ではなく、位置 (?) になっているように見えることに気付きました。
理由はありますか?例外の一部を次に示します。
grant0_.\"Id\" を column1_39_ として選択し、grant0_.\"Version\" を column2_39_ として選択し、.... および (grant0_.\"IsPublic\"=TRUE または (grant0_.\"UserId\" が null でない) を選択し、 grant0_.\"UserId\"=?) および grant0_.\"PermissionFlags\"&?=?
名前:p1 - 値:9011 名前:p2 - 値:4 名前:p3 - 値:4
編集:
これは NpqsqlCommand.ReplaceParameterValue() 関数で見ました - より多くの演算子を含める必要があるかもしれません。私はそれを実験しています。
String pattern = "[- |\n\r\t,)(;=+/<>][:|@]" + parameterMarker + parameterName + "([- |\n\r\t,)(;=+/<>]|$)";
回答: 私自身の質問に答えるのが悪い形式ではないことを願っていますが、問題は、Npgsql ドライバー 2.0.12 が「&」記号に続くパラメーターを正しく置き換えないことです。これは、整数をビット フィールドとして使用する場合に発生します。以下はLinqです:
Where(g => (g.flag & flag) == flag)
Npgsql チームにパッチを提出します。