stackexchange.dapper是否支持以下sql语法?
INSERT INTO MyTable (a, b, c) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
我见过一些例子,你可以传递一个列表插入,但我看到的描述表明,它只是循环和做多个插入。我的研究表明,使用多行进行单个查询速度更快,所以我很好奇dapper是否支持使用列表进行查询。
7hiiyaii1#
不,没有。实际上,批量插入是讨论最多的问题之一。我从来没有想到你要的解决方案。一个我能想象的黑客(不确定;从未尝试)是通过 DynamicParameters 替换实际值(1、2、3….)。因此,您的查询如下所示:
DynamicParameters
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 查询(正如你在问题中提到的)非常有效。 Package Execute 来电交易可能会有所帮助。否则,一般推荐以下解决方案:旁通短节;使用ado.net。对用户定义的表参数使用存储过程。用dapper传递表值参数使用其他一些工具,如sqlbulkcopy、dapper plus、microorm.dapper.repositories等。我从来没有用过那些工具;所以我不知道他们的表现或其他缺点。
List
INSERT
Execute
nbewdwxp2#
正如amit joshi所说dapper不支持这种语法。根据我的经验,最有效的方法是使用存储过程并传递表值参数。如果您有一个列表,可以使用这个numget将列表转换为datatable。披露,我建议的nuget是我的
2条答案
按热度按时间7hiiyaii1#
不,没有。
实际上,批量插入是讨论最多的问题之一。我从来没有想到你要的解决方案。
一个我能想象的黑客(不确定;从未尝试)是通过
DynamicParameters
替换实际值(1、2、3….)。因此,您的查询如下所示:然后,你进去
DynamicParameters
如下所示:正如我上面所说,这就是我的想象;我没有试过。即使这样做有效,这也不是一个好的解决方案,因为字符串构建成本将很高,管理太多参数将很棘手。另外,在rdbms方面,您可以传递多少个最大参数也是有限制的。所以,我不推荐这个。
如果记录的数量不是太多或者性能不是那么关键(仍然很重要;我同意),通过
List
至INSERT
查询(正如你在问题中提到的)非常有效。 PackageExecute
来电交易可能会有所帮助。否则,一般推荐以下解决方案:
旁通短节;使用ado.net。
对用户定义的表参数使用存储过程。
用dapper传递表值参数
使用其他一些工具,如sqlbulkcopy、dapper plus、microorm.dapper.repositories等。
我从来没有用过那些工具;所以我不知道他们的表现或其他缺点。
nbewdwxp2#
正如amit joshi所说dapper不支持这种语法。
根据我的经验,最有效的方法是使用存储过程并传递表值参数。
如果您有一个列表,可以使用这个numget将列表转换为datatable。
披露,我建议的nuget是我的