dapper - 是否可以同时通过 dapper 运行 Insert 和 Get?
问题描述
使用 ASP.NET Core3.1 和 Dapper,我想在我的数据库中插入一条记录并获得整个表作为结果!目前我有两个查询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 });
第二:插入顶部记录后获取整个表:
//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 一次查询获得以上所有内容!事实上,我们QueryMultipleAsync
在 dapper 中可以管理多个查询(正如我自己所做的那样),但我不知道我们是否可以合并一个ExecuteAsync
andQueryAsync
并将它们全部放在一个查询中以获得更好的性能。我需要这样的东西:
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
不返回网格(除非您使用该OUTPUT
子句。您可以在SQL 操作中执行任意数量的操作 - Dapper 关心的只是结果网格,所以是的,您可以执行一个update
和(单独)一个select
. Execute
over的唯一意义Query
是Execute
期望零网格。如果您要返回单个网格,那么Query
; 如果您要返回多个网格: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>();
}
虽然说实话,我可能很想select
用 Dapper 对值元组的位置处理来做一个 final :
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
推荐阅读
- node.js - MongoDB:如何聚合和 $group 然后过滤特定日期
- pandas - 如果多列的值符合特定条件,如何在新列中合并熊猫数据框的多列标题
- git - 警告:无法访问 D:\/.config/git/config':权限被拒绝
- python - 使用 Pandas 导入 MYSQL 时出现问题:UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-7: character maps to
- python - 将参数传递给上下文管理器
- node.js - 在 Promise 中使用 async-await
- javascript - 私有 s3 存储桶中匿名用户对对象的读取访问权限
- javascript - Promise 中的 $emit 函数
- python - 如何在 Python 中使用 WinIo?
- nginx - 一台服务器上有两个不同的项目(配置nginx静态)