C# 尝试将json放入原始sql查询并获取;输入字符串的格式不正确";

C# 尝试将json放入原始sql查询并获取;输入字符串的格式不正确";,c#,json,postgresql,entity-framework-core,ef-core-2.0,C#,Json,Postgresql,Entity Framework Core,Ef Core 2.0,因此,我使用postgresql,需要更新一些“jsonb”字段,并尝试使用普通sql查询来实现这一点,但当我尝试使用插值字符串或普通字符串来实现这一点时,有点棘手 当我使用json对象时,serrialization代码正在工作: await _ctx.Database.ExecuteSqlCommandAsync($"UPDATE \"PropertyItems\" SET \"_media\" = {JsonConvert.SerializeObject(new { })}::jsonb"

因此,我使用postgresql,需要更新一些“jsonb”字段,并尝试使用普通sql查询来实现这一点,但当我尝试使用插值字符串或普通字符串来实现这一点时,有点棘手

当我使用json对象时,serrialization代码正在工作:

await _ctx.Database.ExecuteSqlCommandAsync($"UPDATE \"PropertyItems\" SET \"_media\" = {JsonConvert.SerializeObject(new { })}::jsonb");
但是,当我试图手动设置json结构时,它失败了

var buf = $"UPDATE \"PropertyItems\" SET \"_media\" = '{{}}'::jsonb";  //fail
var buf = $"UPDATE \"PropertyItems\" SET \"_media\" = {{}}::jsonb";    //fail
var buf = $"UPDATE \"PropertyItems\" SET \"_media\" = \'{{}}\'::jsonb"; //fail
await _ctx.Database.ExecuteSqlCommandAsync(buf);

我有点好奇为什么会发生这种情况,是否还有一种方法可以让它只使用字符串,而不使用json序列化?

对于空对象,您是否可以将其设置为null?或者{}而不是{{}?刚刚用DevArt\EntityFramework LIB跳过了一些障碍。“”不起作用,whitspace也不起作用,您必须实际将字段设置为null。但是如果您使用pgAdmin,它将接受:{}、{}、“”,但不接受{{}@静默编码器使用参数化查询,而不是通过字符串连接或格式化来构造sql查询。SQL注入只是由此引起的问题之一。引用错误和转换错误是另外两个问题。事情就是这样here@silent_coder另一个问题是,第一个代码段可能没有使用字符串插值。EF Core 2.0的一个非常有争议的特性是,它使用与字符串插值相同的机制来构造参数化查询。在第二个代码段中,尽管您使用的是普通的旧字符串格式,但存在所有问题。通过将
$“UDPATE…”
代码移到另一行,您就暴露了字符串的所有问题concatenation@silent_coder具体地说,在编写
$”时,“..{whatever}”
C#不会在运行时执行格式化步骤。它使用占位符创建Formattable对象,占位符的值来自
{}
中的任何内容。在运行时,EF Core接受此Formattable并构造一个参数化查询,其中包含通过执行代码创建的值。@silent_coder您可以尝试使用
ExecuteSqlCommandAsync(“更新\“PropertyItems\”SET \“\u media\”={0}::jsonb”,JsonConvert.SerializeObject(someObject))?这是EF Core中参数化查询的语法。我不确定在字符串中包含
::jsonb
是否有效,或者是否需要编写
\“media\”={0}
。这将把json字符串作为字符串参数发送到查询