C# 根据性能考虑更新N行

C# 根据性能考虑更新N行,c#,sql-server,asp.net-mvc,dapper,C#,Sql Server,Asp.net Mvc,Dapper,我有一个带有OrderSequence的表,模式大致如下: 身份证 名字 顺序 我的MVC操作代码中有一个ID数组(“1”、“2”、“3”、“4”),我想设置SequenceOrder进行排序。我不想通过.Net循环它并执行N个sql查询。我应该如何使用dapper/raw ado.net进行此操作?dapper可以通过以下方式进行此操作: connection.Execute("update Orders set Sequence=@seq where Id=@id",

我有一个带有OrderSequence的表,模式大致如下:

  • 身份证
  • 名字
  • 顺序

我的MVC操作代码中有一个ID数组(“1”、“2”、“3”、“4”),我想设置SequenceOrder进行排序。我不想通过.Net循环它并执行N个sql查询。我应该如何使用dapper/raw ado.net进行此操作?

dapper可以通过以下方式进行此操作:

connection.Execute("update Orders set Sequence=@seq where Id=@id",
            ids.Select((id, seq) => new { id, seq }));
然而,这只是使用dapper展开一个循环-实际上它代表您每行调用
Execute
,与您所做的完全相同:

int seq = 0;
foreach(var id in ids) {
    connection.Execute("update Orders set Sequence=@seq where Id=@id",
         new { id, seq });
    seq++;
}

如果要一次性传递所有数据,可以查看表值参数。

不是使用Dapper,而是使用ADO.NET。研究存储过程的结构化参数以及如何传递它们。基本上,您将立即将整个数组作为表值变量发送到SP,然后从更新表中执行更新。所以,只有一次到数据库的往返。我知道dapper可以执行任意sql语句,可以这样做吗?是的,但这意味着要在应用程序中的某个地方硬编码更新查询,然后在
中传递数组,其中。。。在(…)
语句中。总而言之,比结构化参数要难看得多。@marceln我不介意在这个例子中使用硬编码查询,您有样本吗?SequenceOrder只是从某个起始位置开始递增吗?意思是:最后预期的OrderSequence值是什么?是将值传递给storedprocs?太好了,我不知道他们已经发布了。是时候更新了。如果我在交易中使用你的答案,会不会受到同样的伤害?我只更新<15rows@Lee存储的过程与命令文本辩论是不相关的-dapper可以很好地处理这两种情况