使用 PetaPoco 从 PostgreSQL 返回记录 ID

Returning record ID's from PostgreSQL using PetaPoco

PetaPoco PostgreSQL 11.1

我正在尝试获取已删除记录 ID 的列表。这不起作用:

var sql = new Sql()
      .Append(@"; WITH _in (lastname, firstname, birthdate, description, dencounter) AS (
                  VALUES ( UPPER(@0), UPPER(@1), @2::date, LOWER(@3), @4::date  )
                       )
                   DELETE FROM dx d
                    USING _in n
                   JOIN patients pt ON (pt.lastname, pt.firstname, pt.birthdate) = (n.lastname, n.firstname, n.birthdate)
                  JOIN disease z ON (z.description = n.description)
                  WHERE (d.patient_recid, d.disease_recid, d.dposted)=(pt.recid, z.recid, n.dencounter)
               RETURNING d.recid;", lastName, firstName, birthDate, description, tencounter);

      return db.Fetch<int?>(sql);

RETURNING 未兑现。 (我收到显示删除成功的“1”,而不是 recid 值)。它在 pgAdmin 4 中正确运行。

有没有办法用 PetaPoco(和 C#)做到这一点?我不仅要寻找一个 recid,还要寻找一个 IEnumerable of int?来自许多删除。

TIA

我花了一点时间才明白这里发生了什么。

Fetch<T> 运行查询,returns 将结果集设置为类型化列表。直接来自文档。

您可能需要遵守其中的打字部分。

希望下面的内容演示了正在发生的事情。

public class TypedReturn { 
   public string recid { get; set; }
}

var sql = new Sql()
    .Append(@"; WITH _in (lastname, firstname, birthdate, description, dencounter) AS (
                VALUES ( UPPER(@0), UPPER(@1), @2::date, LOWER(@3), @4::date  )
                )
                  DELETE FROM dx d
                    USING _in n
                   JOIN patients pt ON (pt.lastname, pt.firstname, pt.birthdate) = (n.lastname, n.firstname, n.birthdate)
                  JOIN disease z ON (z.description = n.description)
                  WHERE (d.patient_recid, d.disease_recid, d.dposted)=(pt.recid, z.recid, n.dencounter)
               RETURNING d.recid;", lastName, firstName, birthDate, description, tencounter);

List<TypedReturn> returnValues = db.Fetch<TypedReturn>(sql);

foreach(var returnValue in returnValues) 
{
    Console.WriteLine(returnValue.recid);
}

或者您可以使用 dynamic,您愿意这样做

var sql = new Sql()
    .Append(@"; WITH _in (lastname, firstname, birthdate, description, dencounter) AS (
                VALUES ( UPPER(@0), UPPER(@1), @2::date, LOWER(@3), @4::date  )
                )
                  DELETE FROM dx d
                    USING _in n
                   JOIN patients pt ON (pt.lastname, pt.firstname, pt.birthdate) = (n.lastname, n.firstname, n.birthdate)
                  JOIN disease z ON (z.description = n.description)
                  WHERE (d.patient_recid, d.disease_recid, d.dposted)=(pt.recid, z.recid, n.dencounter)
               RETURNING d.recid;", lastName, firstName, birthDate, description, tencounter);

List<dynamic> returnValues = db.Fetch<dynamic>(sql);

foreach(var returnValue in returnValues) 
{
    Console.WriteLine(returnValue.recid);
}