我目前使用實體框架並需要定期更新大量實體。SQL精簡版批量更新
我需要做的是添加日誌編號,它基於幾個不同的表格。使用SQL Server,我可以使用一個存儲過程,使用內部和外部連接,GROUP BY和ROW_NUMBER,這對我來說很繁重,而且效率也很高。
查看程序代碼如下:在SQL CE不是可用
由於存儲過程,以及如何在子選擇使用GROUP BY進一步的限制,我現在要計算日誌數量在代碼中。我在Context上使用SqlQuery來檢索所需的最小數據集,對它進行分組,然後開始每個實體的更新。
SELECT ZID
FROM
(SELECT S.Id as [SID], Z.Id as [ZID], B.Id as [BID], S.TicksCreatedOn
FROM ChildTable AS B
INNER JOIN TableWithNumber as Z on Z.ChildTableRefA_Id = B.Id
INNER JOIN ParentTable as S on Z.ParentTable_Id = S.Id
WHERE S.Ref_Id = @RefId
UNION
SELECT S.Id as [SID], Z.Id as [ZID], B.Id as [BID], S.TicksCreatedOn
FROM ChildTable AS B
INNER JOIN TableWithNumber as Z on Z.ChildTableRefB_Id = B.Id
INNER JOIN ParentTable as S on Z.ParentTable_Id = S.Id
WHERE S.Ref_Id = @RefId) AS D
ORDER BY TicksCreatedOn, ZID, BID
var result = Database.SqlQuery<NumberUpdate>(QUERY, new SqlCeParameter("@RefId", 1)).ToList();
上的應用程序的代碼看起來有點像這樣
var grouped = result
.Select((x,y) => new NumberUpdate { ZID = x.ZID, Number = ++y })
.GroupBy(x => x.ZID);
foreach (var group in grouped)
{
Database.ExecuteSqlCommand("UPDATE TableWithNumber SET Number = @Nr WHERE Id = @Id",
new SqlCeParameter("@Nr", group.Min(x => x.Number)),
new SqlCeParameter("@Id", group.Key));
}
我想知道如果有一個更快或更有效的方式來更新SQL CE實體的名單比在foreach調用ExecuteSqlCommand循環?
我能找到的唯一改進是在'foreach'循環之前準備好SqlCeCommand,然後在循環中只改變現有參數的值。但是SQL CE中的UPDATE非常有限。 – 2014-10-29 14:59:13
如果您需要嵌入式數據庫中的存儲過程和觸發器,請考慮[LocalDB](http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql- express.aspx)。 – 2014-10-29 16:43:56
LocalDB本來就非常棒,並會喜歡使用它。但是,我們的應用程序的一個關鍵要求是,它應該是可部署的複製/過去,並且不需要安裝例程。由於LocalDB需要在客戶端進行設置,因此不幸的是這不是一個選項。再一次,我會很樂意使用它。 – UrbanEsc 2014-10-29 20:19:48