是否可以同时 运行 Insert 和 Get by dapper?

Is it possible to run an Insert and Get by dapper simultaneously?

使用 ASP.NET Core3.1 和 Dapper,我想在我的数据库中插入一条记录并得到整个 table 作为结果!目前我的 repository 中有两个查询,如下所示: 首先:向我的数据库中插入一条记录:

   //some codes here
  string sql = "UPDATE likes AS L SET L.isLike = @isLikeSQL WHERE L.ItemId = @ItemIdSQL  AND L.Ip = @IpSQL ";
  await dbConnection.ExecuteAsync(sql, new { ItemIdSQL = ItemId, senderpSQL = Ip, isLikeSQL = isLike });

其二:插入最前面的记录后得到整个table:

//some codes here
string sql = " SELECT COUNT(*) FROM likes AS I WHERE I.ItemId = @itemIdSQL  AND I.isLike=1; " +
            " SELECT COUNT(*) FROM map118.likes AS I WHERE I.ItemId = @itemIdSQL  AND I.isLike=0; ";
using (var data = await dbConnection.QueryMultipleAsync(sql, new { itemIdSQL = ItemId }))
    {
      numberOfLikes = data.Read<int>().FirstOrDefault();
      numberOfDislikes = data.Read<int>().FirstOrDefault();
    }

我想知道我是否可以通过 dapper 在一次查询中获得以上所有信息!!事实上,我们在 dapper 中有 QueryMultipleAsync 可以管理多个查询(正如我自己所做的那样)但我不知道我们是否可以合并 ExecuteAsyncQueryAsync 并拥有它们在一个查询中以获得更好的性能。我需要这样的东西:

string sql =
 "UPDATE likes AS L SET L.isLike = @isLikeSQL WHERE L.ItemId = @ItemIdSQL  AND  L.Ip = @IpSQL " +
 " SELECT COUNT(*) FROM likes AS I WHERE I.ItemId = @itemIdSQL  AND  L.isLike=1; "

using (var data = await dbConnection.QueryOrExecute???(sql, new { itemIdSQL = ItemId }))
    {
      numberOfLikes = data.Read<int>().FirstOrDefault();
      numberOfDislikes = data.Read<int>().FirstOrDefault();
    }

UPDATE 不是 return 网格(除非您使用的是 OUTPUT clause。您可以像 一样进行尽可能多的操作 在 SQL 操作中——Dapper 只关心结果网格,所以是的,您可以执行 update (分别)一个 selectExecute 优于 Query 的唯一意义在于 Execute 需要 个网格。如果你 return单个网格,然后 Query;如果你 return 多个网格:QueryMultiple。Dapper 对查询内部发生的事情不感兴趣 - 它完全不透明 - 它所看到的只是结果网格.

不过,

高度推荐使用形式运算分隔符(;)。例如:

const string sql = @"
UPDATE likes AS L
SET L.isLike = @isLike
WHERE L.ItemId = @ItemId AND L.Ip = @Ip;

SELECT COUNT(*) FROM likes AS I WHERE I.ItemId = @ItemId AND L.isLike=1;
SELECT COUNT(*) FROM likes AS I WHERE I.ItemId = @ItemId AND L.isLike=0;
"
using (var data = await dbConnection.QueryMultipleAsync(sql,
    new { ItemId, isLike, Ip }))
{
    numberOfLikes = data.ReadSingle<int>();
    numberOfDislikes = data.ReadSingle<int>();
}

虽然老实说我可能很想做,但使用 Dapper 的位置处理 value-tuples:

const string sql = @"
UPDATE likes AS L
SET L.isLike = @isLike
WHERE L.ItemId = @ItemId AND L.Ip = @Ip;

SELECT 
    (SELECT COUNT(*) FROM likes AS I WHERE I.ItemId = @ItemId AND L.isLike=1),
    (SELECT COUNT(*) FROM likes AS I WHERE I.ItemId = @ItemId AND L.isLike=0);
"
(var numberOfLikes, var numberOfDislikes) =
    await dbConnection.QuerySingleAsync<(int,int)>(sql,
    new { ItemId, isLike, Ip });

或涉及 group by L.isLike

的内容