是否可以同时 运行 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
可以管理多个查询(正如我自己所做的那样)但我不知道我们是否可以合并 ExecuteAsync
和 QueryAsync
并拥有它们在一个查询中以获得更好的性能。我需要这样的东西:
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
和 (分别)一个 select
。Execute
优于 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
的内容
使用 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
可以管理多个查询(正如我自己所做的那样)但我不知道我们是否可以合并 ExecuteAsync
和 QueryAsync
并拥有它们在一个查询中以获得更好的性能。我需要这样的东西:
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
和 (分别)一个 select
。Execute
优于 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