sql - SQL MERGE语句用Dapper一一运行记录
问题描述
所以我正在使用这样的MERGE
语句查询Dapper
string sql = @$"MERGE Internal.AssessmentStrategy AS TARGET
USING (VALUES (@Id, @AssessmentId, @StrategyId, @CreatedBy, @CreatedAt, @UpdatedAt)) AS SOURCE (Id, AssessmentId, StrategyId, CreatedBy, CreatedAt, UpdatedAt)
ON SOURCE.AssessmentId = TARGET.AssessmentId AND SOURCE.StrategyId = TARGET.StrategyId
WHEN NOT MATCHED BY TARGET
THEN INSERT (Id, AssessmentId, StrategyId, CreatedAt, CreatedBy, UpdatedAt)
VALUES (SOURCE.Id, SOURCE.AssessmentId, SOURCE.StrategyId, SOURCE.CreatedAt, SOURCE.CreatedBy, SOURCE.UpdatedAt)
WHEN NOT MATCHED BY SOURCE
THEN DELETE;
";
var source = request.StrategyIds.ToList<Guid>().Select(s => new
{
Id = Guid.NewGuid(),
AssessmentId = request.AssessmentId,
StrategyId = s,
CreatedBy = request.UserId,
CreatedAt = DateTime.Now,
UpdatedAt = DateTime.Now
});
await connection.ExecuteAsync(sql, source);
基本上发生的事情是,Dapper 正在为我传递的每条记录运行此语句,SOURCE
而不是一次性针对所有记录,因此无论我传递什么记录SOURCE
,查询完成后只有最后一个保留在目标中其余的都被删除。
所以基本上,这就是正在发生的事情,比如说
目标有1
来源有1, 2, 3
那么dapper正在做的是
它运行对 SOURCE 的第一条记录的查询,
1
发现它已经存在于 TARGET 中,所以什么也不做然后它运行它进行记录
2
,发现1
必须从 TARGET 中删除并且2
必须插入,所以现在 TARGET 留下了记录2
然后它运行它进行记录
3
,发现2
必须从 TARGET 中删除并且3
必须插入,所以最后 TARGET 留下了值3
所以每次 TARGET 都会留下我通过的最后一条记录。
我不知道如何让它像一张记录表而不是单个记录一样一次性考虑所有记录。
任何想法?
解决方案
推荐阅读
- javascript - 视频/音频通信
- javascript - 我可以确定这将始终返回一个唯一的字母数字字符串吗?
- php - innerhtml+= 如何从 ajax 获取加载数据然后执行操作?
- javascript - 单击另一个选择字段时,如何禁用选择选项?
- node.js - 如何从 google Passport 检索、保存和更新 idToken
- javascript - 如何将文本文件中的行推送到数组中,以便以后对其进行操作
- python - 我的 python 代码做了它打算做的事情,但是中断/继续使用 try/catch 块?
- javascript - 无法在电子中加载反应开发工具
- python - 根据标签、类和字符串内容提取html块
- python - 在有特定键值对的列表中获取字典