我正在使用客户端拖放数据表的排序顺序。排序顺序作为简单的整数值保存在数据库中。架构如下所示:
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的方法通过任意数组的身份值
我希望这个问题不会违反网站规则 - 我确实有一张支票,我觉得没问题。我也意识到答案可能只是一个'不',但在这种情况下,我仍然对确认感兴趣。
答案 0 :(得分:1)
假设Ids不会改变,这些是我认为你有的选择。
以下是您需要的更改摘要。
作为SP的参数,要么传入id的XML,要么传递表类型。 (http://msdn.microsoft.com/en-us/library/bb675163(v=vs.110).aspx)。
如果您使用xml传入值,请将XML条目插入表变量。请在此处保留一个标识列,以便最终成为排序顺序。
使用id加入临时表中的表。
例如
UPDATE Tab
SET SortOrder = [Idnetityfield]
FROM Table Tab
INNER JOIN TempTable Temp ON Temp.id=Tab.id
我认为这是一种可以接近您的情景的方式。