有没有更有效的方法来更新整个表的排序顺序

本文关键字:排序 顺序 有效 方法 有没有 更新 | 更新日期: 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不会更改,我认为您有这些选项。

以下是您需要的更改摘要。

  1. 在存储过程中移动更新。(SP)
  2. 作为SP的参数,传入id的XML或传入表类型。(http://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx).

  3. 如果使用xml传递值,请将xml条目插入表变量中。在此处保留一个标识列,以便最终成为排序顺序。

  4. 将您拥有的表与id为的临时表连接起来

  5. 使用Join编写一个更新语句,它基本上用IdentityColumn数据更新SortOrder字段

例如

UPDATE Tab
SET SortOrder = [Idnetityfield]
FROM Table Tab
INNER JOIN TempTable Temp ON Temp.id=Tab.id

我认为这是一种你可以处理你的场景的方式。