2014-10-29 72 views
1

我目前使用實體框架並需要定期更新大量實體。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循環?

+0

我能找到的唯一改進是在'foreach'循環之前準備好SqlCeCommand,然後在循環中只改變現有參數的值。但是SQL CE中的UPDATE非常有限。 – 2014-10-29 14:59:13

+0

如果您需要嵌入式數據庫中的存儲過程和觸發器,請考慮[LocalDB](http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql- express.aspx)。 – 2014-10-29 16:43:56

+0

LocalDB本來就非常棒,並會喜歡使用它。但是,我們的應用程序的一個關鍵要求是,它應該是可部署的複製/過去,並且不需要安裝例程。由於LocalDB需要在客戶端進行設置,因此不幸的是這不是一個選項。再一次,我會很樂意使用它。 – UrbanEsc 2014-10-29 20:19:48

回答

0

如果您的業務邏輯允許您「逐行」更新多個表中的數據(而不是使用複雜的SQL命令),那麼您可以嘗試「table-direct」方法。它涉及以下步驟。

創建SqlCeConnection連接字符串指向您的SDF文件的對象。創建SqlCeCommand此命令類型的連接的對象CommandType.TableDirect。創建SqlCeResultSet帶選項ResultSetOptions.UpdatableResultSetOptions.Scrollable

現在你可以使用尋求更新方法來更新錶行。這種方法可能是最快的方法。但是它需要比傳統的EF方法編寫更多的代碼。