有没有更有效的方法来更新整个表的排序顺序
本文关键字:排序 顺序 有效 方法 有没有 更新 | 更新日期: 2023-09-27 18:29:57
我对数据表使用客户端拖放排序。排序顺序将作为一个简单的整数值保留在数据库中。模式如下所示:
Id | Title | SortOrder
1 | A | 0
2 | B | 1
3 | C | 2
只需简单的ORDER BY
就可以提取数据,一切都很好。
我实现的客户端拖放以新的顺序发布一个ID数组,然后使用Dapper将其持久化到数据库中,如下所示(为简洁起见,删除了服务层):
[HttpPost]
public ActionResult UpdateSort(int[] ids)
{
if (ids != null && ids.Length > 0)
{
using (var con = Connection.OpenSql())
{
for (var i = 0; i < ids.Length; ++i)
con.Execute("UPDATE Table SET SortOrder = @sort WHERE Id = @id", new { sort = i, id = ids[i] });
}
}
return new HttpStatusCodeResult(200);
}
这很好,但我想知道是否有更好的方法来处理更新,假设客户端的情况不会改变。我们现在每行执行一条SQL语句,有什么方法可以使其参数化并批处理它们吗?有可能完全去掉循环吗?
与此代码一起使用的记录数量很少,因此这并不是一个大问题-这个问题实际上只是一个好奇的问题,因为我想不出一种方法可以通过任意的标识值数组轻松地订购一些SQL
我希望这个问题不会违反网站规则-我确实检查过了,我认为没问题。我也意识到答案很可能只是"不",但如果是这样的话,我仍然对确认感兴趣。
假设Id不会更改,我认为您有这些选项。
以下是您需要的更改摘要。
- 在存储过程中移动更新。(SP)
-
作为SP的参数,传入id的XML或传入表类型。(http://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx).
-
如果使用xml传递值,请将xml条目插入表变量中。在此处保留一个标识列,以便最终成为排序顺序。
-
将您拥有的表与id为的临时表连接起来
- 使用Join编写一个更新语句,它基本上用IdentityColumn数据更新SortOrder字段
例如
UPDATE Tab
SET SortOrder = [Idnetityfield]
FROM Table Tab
INNER JOIN TempTable Temp ON Temp.id=Tab.id
我认为这是一种你可以处理你的场景的方式。