尝试使用 FromSqlInterpolated 查询 postgres 数据库,特别是表的 jsonb 列,因此,我需要在查询中使用花括号。
这是 postgresql 中的查询:
SELECT a.* from "assignment" a WHERE a."data"-> 'SubAssignmentCodes' @> '[{"Code": "remoteName"}]' or code = '{remoteName}'
现在尝试将该查询放入 FromSqlInterpolated 中。
问题在于,c# 认为查询这部分中的大括号
('[{"Code": "remoteName"}]')
是插值大括号,而不是查询的大括号。
我显然可以逃避它们,但这样做时,它会从提交到数据库的最终查询中一起删除大括号。
我什至尝试将查询的那部分分开:
.FromSqlInterpolated($"SELECT a.* from \"assignment\" a WHERE a.\"data\" -> 'SubAssignmentCodes' @> {lastBit}::jsonb or code = '{assignmentCode}'")
和
var lastBit = "'[{{\"Code\": \"{assignmentCode}\"}}]'";
这个查询几乎可以工作,但给出了这个错误:
Npgsql.PostgresException:'22P02:json 类型的输入语法无效'
这是我最初的尝试:
.FromSqlInterpolated($"SELECT a.* from \"assignment\" a WHERE a.\"data\"-> 'SubAssignmentCodes' @> '[{{\"Code\": {assignmentCode}}}]' or code = {assignmentCode}")
我将lastBit更改为:
var lastBit = System.Text.Json.JsonSerializer.Serialize(new[] { new { Code = "assignmentCode" } });
它现在可以工作了。事实证明它确实是无效的 JSON,正确地序列化它而不是自己将 JSON 写入字符串才是解决方案。