Dapper是否支持在单个查询中插入多行?

时间:2018-04-16 19:34:13

标签: mysql mariadb dapper

StackExchange.Dapper是否支持以下SQL语法?

INSERT INTO MyTable (a, b, c)
VALUES
  (1, 2, 3),
  (4, 5, 6),
  (7, 8, 9);

我已经看到了一些例子,你可以传入一个要插入的List,但我见过的描述表明它只是循环并进行多次插入。

我的研究表明,在其中执行包含多行的单个查询的速度更快,因此我很想知道Dapper是否支持使用列表。

2 个答案:

答案 0 :(得分:2)

不,它没有。

实际上,批量插入是讨论最多的问题之一。我从来没有遇到过你在寻找Dapper的解决方案。

我能想象的一个黑客(不确定;从未尝试过)是通过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来电可能有所帮助。

否则,通常建议采用以下解决方案:

  1. 绕过小巧玲珑;使用ADO.NET。
  2. 将存储过程与“用户定义表”参数一起使用。
  3. Passing Table Valued Parameters with Dapper
  4. 使用其他工具,例如SqlBulkCopyDapper PlusMicroOrm.Dapper.Repositories等 我从未使用过这些工具;所以我不了解他们的表现或其他缺点。

答案 1 :(得分:0)

正如Amit Joshi所说,Dapper并不支持这种语法。

根据我的经验,我可以向您推荐,最有效的方法是使用存储过程并传递表值参数。
如果您有列表,则可以使用此nuget将列表转换为DataTable
披露,我建议的nuget是我的