dapper支持在一个查询中插入多行吗?

khbbv19g  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(360)

stackexchange.dapper是否支持以下sql语法?

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

我见过一些例子,你可以传递一个列表插入,但我看到的描述表明,它只是循环和做多个插入。
我的研究表明,使用多行进行单个查询速度更快,所以我很好奇dapper是否支持使用列表进行查询。

7hiiyaii

7hiiyaii1#

不,没有。
实际上,批量插入是讨论最多的问题之一。我从来没有想到你要的解决方案。
一个我能想象的黑客(不确定;从未尝试)是通过 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方面,您可以传递多少个最大参数也是有限制的。所以,我不推荐这个。
如果记录的数量不是太多或者性能不是那么关键(仍然很重要;我同意),通过 ListINSERT 查询(正如你在问题中提到的)非常有效。 Package Execute 来电交易可能会有所帮助。
否则,一般推荐以下解决方案:
旁通短节;使用ado.net。
对用户定义的表参数使用存储过程。
用dapper传递表值参数
使用其他一些工具,如sqlbulkcopy、dapper plus、microorm.dapper.repositories等。
我从来没有用过那些工具;所以我不知道他们的表现或其他缺点。

nbewdwxp

nbewdwxp2#

正如amit joshi所说dapper不支持这种语法。
根据我的经验,最有效的方法是使用存储过程并传递表值参数。
如果您有一个列表,可以使用这个numget将列表转换为datatable。
披露,我建议的nuget是我的

相关问题