2010-01-25 77 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

是的,你必須拉下你的物體,操縱它們,然後推回去。

推送新照片時,客戶端負責調用什麼?您可能會將其設置爲觸發器,因此您的應用程序不會直接對額外(容易被遺忘的)步驟負責。這當然是一種複雜性的折衷,並且是一種偏好問題。