Я перехожу с 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.
"[- |\n\r\t,)(;=+/<>][:|@]" + parameterMarker + parameterName + "([- |\n\r\t,)(;=+/<>]|$)"
. Нужно ли включать побитовый оператор? - person LogicMan   schedule 12.02.2013