是否有更有效的方法来更新整个表的排序顺序?

时间:2014-11-11 12:01:46

标签: c# sql-server asp.net-mvc tsql dapper

我正在使用客户端拖放数据表的排序顺序。排序顺序作为简单的整数值保存在数据库中。架构如下所示:

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的方法通过任意数组的身份值

我希望这个问题不会违反网站规则 - 我确实有一张支票,我觉得没问题。我也意识到答案可能只是一个'不',但在这种情况下,我仍然对确认感兴趣。

1 个答案:

答案 0 :(得分:1)

假设Ids不会改变,这些是我认为你有的选择。

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

  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字段。
  6. 例如

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

    我认为这是一种可以接近您的情景的方式。