NHibernate + Npqsql + LINQ дает параметр p1, не найденный в запросе

Я перехожу с MySQL на Postgres, и некоторые запросы linq вызывают исключения. В частности, у меня возникает проблема с запросом, который добавляет побитовое сравнение операторов. Я заметил, что параметры в строке SQL кажутся позиционными (?), а не именованными (:p1, :p2, :p3).

Есть идеи, почему? Вот часть исключения:

выберите Grant0_.\"Id\" как column1_39_, grant0_.\"Версия\" как column2_39_, .... и (grant0_.\"IsPublic\"=TRUE или (grant0_.\"UserId\" не равно нулю) и 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 неправильно заменяет параметры, когда они следуют за символом '&'. Это происходит, когда вы используете целое число в качестве битового поля. Ниже приведен Линк:

Where(g => (g.flag & flag) == flag)

Я отправлю патч команде Npgsql.


person LogicMan    schedule 11.02.2013    source источник
comment
Исключение выдается из Npgsql.NpgsqlCommand.ReplaceParameterValue(), поэтому я не думаю, что оно попадает в базу данных.   -  person LogicMan    schedule 12.02.2013
comment
В драйвере Npgsql в ReplaceParameterValue я увидел это Regex "[- |\n\r\t,)(;=+/<>][:|@]" + parameterMarker + parameterName + "([- |\n\r\t,)(;=+/<>]|$)". Нужно ли включать побитовый оператор?   -  person LogicMan    schedule 12.02.2013
comment
@LogicMan Если вы найдете ответ самостоятельно, вы должны опубликовать его как ответ ниже, а затем пометить его как принятый ответ (есть задержка в несколько дней, прежде чем он позволит вам).   -  person Oskar Berggren    schedule 12.02.2013
comment
... и еще за день до того, как он позволит вам принять свой собственный ответ. Какая ПИТА ;-}   -  person LogicMan    schedule 12.02.2013


Ответы (1)


Я надеюсь, что это не дурной тон, чтобы ответить на мой собственный вопрос, но проблема в том, что драйвер Npgsql 2.0.12 неправильно заменяет параметры, когда они следуют за символом «&». Это происходит, когда вы используете целое число в качестве битового поля. Ниже приведен Линк:

Where(g => (g.flag & flag) == flag)

Я отправлю патч команде Npgsql.

person LogicMan    schedule 12.02.2013