2010-01-25 54 views
3

我有一个存储照片的SQL表,它包含一个smallint SortOrder字段。用户可以插入新照片,指定小数点排序顺序以在2张现有照片(或第一张照片之前)之间放置新记录。 SortOrder将作为smallint存储,因此当我检测到插入操作会移动现有记录时,我需要更新所有受影响的照片以将SortOrder增加1.在Linq中执行条件批量更新到SQL

这很容易在存储过程中完成,但我正在寻找最有效的方法来完成这与Linq to SQL。如果我必须将所有记录提交给客户端,更新它们,然后提交它们,那么我将坚持使用已经运行并且速度非常快的存储过程。

这里的T-SQL是将这个记录:

UPDATE  Photo 
    SET   SortOrder = SortOrder + 1 
    WHERE  AlbumId = @AlbumId 
    AND   SortOrder >= CEILING(@SortOrder) 

有没有办法做这样的批量更新的Linq中,而无需获取记录到SQL?

回答

6

LINQ to SQL不会为集合执行CUD语句,因此请坚持使用您现有的实现,因为它将成为您场景中的最佳实现。

+0

+1用于粘贴sprocs。这似乎是完成LINQ(如跨数据库查询)所不能完成的事情的答案。 – 2010-01-25 08:51:18

0

一个选项是构建存储过程中的sql字符串,并通过DataContext.ExecuteQuery方法执行它。这样做会阻止记录被提取。

+2

我想我宁愿有一个存储过程,而不是将T-SQL硬编码到ExecuteQuery中。 :-) – 2010-01-25 06:13:21

+0

是的,我的第一反应是“如果它在一个存储过程中快速运行,那么为什么要改变它,因为你会用L2S来获取......”但是这是一种做法(虽然很丑) 。 – 2010-01-25 06:22:26

1

是的,你必须拉下你的物体,操纵它们,然后推回去。

推送新照片时,客户端负责调用什么?您可能会将其设置为触发器,因此您的应用程序不会直接对额外(容易被遗忘的)步骤负责。这当然是一种复杂性的折衷,并且是一种偏好问题。