我正在使用客户端拖放数据表的排序顺序。排序顺序作为简单的整数值保存在数据库中。架构如下所示:
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的方法值
我希望这个问题不会破坏网站规则 - 我确实有一个检查,我认为没关系。我也意识到答案可能只是一个'不',但在这种情况下,我仍然对确认感兴趣。
假设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
我认为这是一种可以接近您的场景的方式。