【发布时间】:2021-10-14 23:12:17
【问题描述】:
我在 EF Core 3 中调用了具有多个字符串参数的 ProgresSQL 服务器。其中之一是一个字符串,它是已经用单引号包裹的字符串的串联,如下所示:
var listOfParams = "'a',','b','c'";
然后传递给如下所示的查询:
var id = "Customer1";
DbContext.Database.ExecuteSqlInterpolated(
"SELECT ""CustomerNumber"" FROM dbo.""Customer""
WHERE ""Id"" = {id} AND ""CustomerNumber"" IN ({listOfParams})");
问题是,虽然用引号包裹 id 是正确的,但对于已经有引号的第二个参数,会发生某种形式的第二次换行,或者可能会转义单引号,这是我想避免的。 然而,我找不到任何相对简单的方法。如果可以将 listOfParams 保留为 SQL 参数,那就完美了,否则查询计划的缓存将是不可能的。直接传递列表似乎也不起作用。看起来 EF Core 不支持它。
谢谢,拉德克
【问题讨论】:
-
用引号括起来绝对不正确,
ExecuteSqlInterpolated也不是这样做的。它找到插值并将其更改为命名参数,这意味着您最终得到""CustomerNumber"" IN (@listOfParams),它与""CustomerNumber"" = @listOfParams相同,并且该参数只是一个恰好包含逗号的字符串,它永远不会被解释为一个列表。您需要在变量上使用 JSON 参数或STRING_SPLIT或类似参数 -
@Charlieface:其实你的回答给了我一个想法。我可以稍微修改查询以包含以下内容: select unnest(string_to_array({listOfParams}, ',')) as "CustomerNumber" 然后在我拥有的所有查询中使用此选择的结果。实际上我已经检查过了,它似乎正在工作。谢谢:)
-
确实是一种方法,但是您需要删除引号并像这样
""CustomerNumber"" IN (select * from unnest(string_to_array({listOfParams}, ',')))
标签: c# postgresql .net-core npgsql ef-core-3.0