2012-09-13 158 views
1

我必須使用實體框架更新Sql Server表中的每行約150,000條記錄。爲了減少服務器的命中數量,我想在1000行的單獨批次中執行此操作。我需要實體框架來:如何使用C#和實體框架實現SQL Server分頁?

  1. 從數據庫中選擇前1000行。
  2. 更新這些行。
  3. 調用SaveChanges()方法。
  4. 獲取下一個1000行。
  5. 重複。

最好的方法是什麼?

我使用實體框架4和SQL Server 2012的

+0

這是否需要在交易發生呢? –

+0

@ DanielA.White我不知道你的意思 – broke

回答

2

這樣的事情應該工作:

int skip =0; 
int take = 1000; 
for (int i = 0; i < 150; i++) 
{ 
var rows = (from x in Context.Table 
      select x).OrderBy(x => x.id).Skip(skip).Take(take).ToList(); 

//do some update stuff with rows 

skip += 1000; 
} 
+0

這應該起作用。謝謝! – broke

4

使用LINQSkip & Take

return query.Skip(HOW MUCH TO SKIP -AT THE BEGINNING WILL BE ZERO-) 
    .Take(HOW MUCH TO TAKE -THE NUMBER OF YOUR PAGING SIZE-).ToList(); 

如果你想在一個循環中做到這一點,你可以做這樣的事情:

int pagingIncrement = 1000; 
for (int i = 0; i <= 150 000; i=i+pagingIncrement) 
{ 
    var query = your actual LINQ query. 
    var results = query.Skip(i).Take(pagingIncrement); 

    UpdatePartialResults(results); 
} 

注意:重要的是,在更新這些行時,您不會更新ORDER的條件在你實際的LINQ查詢中,否則你可能會一次又一次地更新相同的結果(因爲重新排序)。

其他想法將擴展IEnumerable迭代器與一些以前給出的想法,如Skip(counter).Take(pagingSize和yield結果(有待異步處理)。

+0

你可以擴展這個嗎?我不知道我將如何在一個循環內實現它。 – broke

+0

@broke查看我的編輯。 –