在Linq to SQL中执行有条件的批量更新

3
我有一个SQL表,用一个smallint SortOrder字段存储照片。用户可以插入新照片,并指定一个小数排序顺序将新记录放置在两个现有照片之间(或者在第一个照片之前)。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中批量更新记录而不必获取这些记录?
4个回答

6
LINQ to SQL不支持对集合执行CUD语句,因此在您的场景中继续使用现有的实现将是最好的选择。

坚持使用存储过程是个好主意。这似乎是解决一些无法通过LINQ实现的任务(例如跨数据库查询)的常用方法。 - Chad Levy

3

哦哦,链接已经失效了。你知道还有其他地方可以找到这个吗? - Swisher Sweet

1

是的,您需要拉取对象,对其进行操作,然后将其推回。

存储过程是否是客户端在推送新照片时负责调用的内容?您最好将其设置为触发器,这样您的应用程序就不必直接负责额外(容易被忘记的)步骤。当然,这是一种复杂性和偏好的权衡。


0
一种选择是构建存储过程中的 SQL 字符串,并通过您的 DataContext.ExecuteQuery 方法执行它。这样做可以防止记录被获取。

2
我认为我更喜欢使用存储过程而不是在ExecuteQuery中硬编码T-SQL。 :-) - Jeff Handley
是的,我的第一反应是“如果存储过程中运行速度很快,那么为什么要改变它呢,因为你将使用L2S进行获取”..但这是一种方法(虽然不太好看)。 - Jeff Schumacher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接