我必須使用實體框架更新Sql Server表中的每行約150,000條記錄。爲了減少服務器的命中數量,我想在1000行的單獨批次中執行此操作。我需要實體框架來:如何使用C#和實體框架實現SQL Server分頁?
- 從數據庫中選擇前1000行。
- 更新這些行。
- 調用SaveChanges()方法。
- 獲取下一個1000行。
- 重複。
最好的方法是什麼?
我使用實體框架4和SQL Server 2012的
我必須使用實體框架更新Sql Server表中的每行約150,000條記錄。爲了減少服務器的命中數量,我想在1000行的單獨批次中執行此操作。我需要實體框架來:如何使用C#和實體框架實現SQL Server分頁?
最好的方法是什麼?
我使用實體框架4和SQL Server 2012的
這樣的事情應該工作:
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;
}
這應該起作用。謝謝! – broke
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結果(有待異步處理)。
你可以擴展這個嗎?我不知道我將如何在一個循環內實現它。 – broke
@broke查看我的編輯。 –
這是否需要在交易發生呢? –
@ DanielA.White我不知道你的意思 – broke