我有一个SQL表,用于存储带有smallint SortOrder字段的照片。用户可以插入新照片,指定小数排序顺序,将新记录放在2张现有照片之间(或第一张照片之前)。 SortOrder将存储为smallint,因此当我检测到插入将移动现有记录时,我需要更新所有受影响的照片以将SortOrder增加1。
这在存储过程中很容易实现,但我正在寻找使用Linq to SQL实现此目的的最有效方法。如果我必须将所有记录下载到客户端,更新它们,然后提交它们,那么我将坚持使用已经工作且速度非常快的存储过程。
这是改变记录的T-SQL:
UPDATE Photo
SET SortOrder = SortOrder + 1
WHERE AlbumId = @AlbumId
AND SortOrder >= CEILING(@SortOrder)
有没有办法在Linq to SQL中进行这种批量更新而无需获取记录?
答案 0 :(得分:6)
LINQ to SQL不会对集合执行CUD语句,因此请坚持使用现有的实现,因为它在您的方案中是最好的。
答案 1 :(得分:3)
我和这些家伙的工作取得了很大的成功: http://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx
我只在开发中使用了几个月,但到目前为止一直都很好。
答案 2 :(得分:1)
是的,你必须拉下你的物体,操纵它们并将它们推回去。
在推送新照片时,客户负责呼叫的是什么?您可能最好将其设置为触发器,因此您的应用程序不会直接负责额外(容易忘记)的步骤。当然,这是复杂性和偏好的权衡。
答案 3 :(得分:0)
一种选择是构建存储过程中的sql字符串,并通过DataContext.ExecuteQuery方法执行它。这样做会阻止记录被提取。