繁体   English   中英

npgsql.EntityFrameworkCore.PostgreSQL - 使用 json 参数执行 function 不起作用

[英]npgsql.EntityFrameworkCore.PostgreSQL - execute function with json parameter is not working

数据库:Postgresql

ORM:实体框架核心与 Npgsql.EntityFrameworkCore.PostgreSQL

试图将以下功能通过产品列表称为 json

dbContext.product.FromSqlRaw("SELECT pa.usp_set_product({0})", productjson).ToList();

返回错误为:“42883:function pa.usp_set_product(text) 不存在”

然后在下面尝试

dbContext.product.FromSqlRaw(@"SELECT pa.usp_set_product('" + productjson+ "')").ToList();

返回错误:“输入字符串的格式不正确”

然后在下面试了下效果很好

 using (var cmd = new NpgsqlCommand(@"SELECT pa.usp_set_product(@productjson)", conn))
   {
    cmd.Parameters.Add(new NpgsqlParameter("productjson", NpgsqlDbType.Json) { Value = productjson});
    cmd.ExecuteNonQuery();
   }

有什么想法,请-

  1. 为什么带有 JSON 参数的 FromSqlRaw 不起作用
  2. 使用 NpgsqlCommand 有什么缺点吗 - 它是否支持 Linux-container(docker)

谢谢,

@保罗

当你在 FromSqlRaw 中包含一个参数值时,它将作为默认对应的 PG 类型发送; 我假设您的productjson是一个 .NET 字符串,它映射到一个 PG text ,而不是json 结果与使用 NpgsqlCommand 的低级代码相同,但没有指定NpgsqlDbType.Json

EF Core 还允许您传递 DbParameter 实例而不是原始值,因此您应该能够执行以下操作:

var jsonParam = new NpgsqlParameter("productjson", NpgsqlDbType.Json);

dbContext.product.FromSqlRaw("SELECT pa.usp_set_product(@jsonParam)", jsonParam).ToList();

此文档页面上提供了更多信息。

注意:切勿将字符串连接或插入到 FromSqlRaw 的 SQL 中 - 这容易受到 SQL 注入的影响。 仔细阅读EF 文档以获取更多信息。

注意2:考虑使用 PostgreSQL jsonb类型而不是json 您可以在此处阅读不同之处。

您是否有理由不使用 LINQ 进行查询? 对于您需要的大多数查询,它更容易、被广泛使用和优化。 如果您创建一个 Product 实体,它看起来像这样:

DbContext.Products.Add(new Product() { ProductName = "Test Product", Weight = 5, ... }
await DbContext.SaveChangesAsync();

然后,如果您想检索 id 为 productId 的产品:

Product product = await DbContext.Products.FirstOrDefaultAsync(p => p.Id == productId);

您需要所有已删除的产品吗?

List<Product> deletedProducts = await DbContext.Products.Where(p => p.DeletionTime != null).ToListAsync();

(这些示例依赖于您向 Product 实体添加所需的属性,例如 Id 和 DeletionTime)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM