我正在从 MySQL 转换为 Postgres,一些 linq 查询会导致异常。具体来说,我在添加按位运算符比较的查询中遇到问题。我注意到 SQL 字符串中的参数似乎是位置 (?) 而不是命名 (:p1, :p2, :p3)。
知道为什么吗?这是异常的一部分:
选择grant0_.\"Id\" 作为column1_39_,grant0_.\"Version\" 作为column2_39_, .... and (grant0_.\"IsPublic\"=TRUE or (grant0_.\"UserId\" is not null) and 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 团队提交补丁。