是否StackExchange.Dapper支持以下 SQL 语法吗?
INSERT INTO MyTable (a, b, c)
VALUES
(1, 2, 3),
(4, 5, 6),
(7, 8, 9);
我看过一些示例,您可以在其中传递要插入的列表,但我看到的描述表明它只是循环并进行多次插入。
我的研究表明,执行包含多行的单个查询速度更快,所以我很想知道 Dapper 是否支持列表。
请您参考如下方法:
不,它没有。
实际上,批量插入是讨论最多的问题之一。我从未遇到过您正在使用 Dapper 寻找的解决方案。
我可以想象(不确定;从未尝试过)的一个 hack 是通过 DynamicParameters
替换您的实际值(1、2、3....)。所以你的查询变成如下所示:
INSERT INTO MyTable (a, b, c)
VALUES
(@1, @2, @3),
(@4, @5, @6),
(@7, @8, @9);
并且,您传入 DynamicParameters
如下所示:
var param = new DynamicParameters();
param.Add("@1", ...);
param.Add("@2", ...);
param.Add("@3", ...);
param.Add("@4", ...);
....
正如我上面所说,这就是我的想象;我没试过。即使可行,这也不是一个好的解决方案,因为字符串构建成本会很高,而且管理太多参数会很棘手。此外,在 RDBMS 端,您可以传递多少个最大参数是有限制的。所以,我不推荐这个。
如果记录数不是太多或者性能不是那么关键(仍然很重要;我同意),将 List
传递给 INSERT
查询(如您mentioned 有问题)效果很好。在 Transaction 中封装 Execute
调用可能有帮助。
否则,一般推荐以下解决方案:
- 绕过 Dapper;使用 ADO.NET。
- 使用带有用户定义表参数的存储过程。
- Passing Table Valued Parameters with Dapper
- 使用其他工具,例如 SqlBulkCopy , Dapper Plus , MicroOrm.Dapper.Repositories等等
我从未使用过这些工具;所以我不知道它们的性能或其他缺点。