我有一個遺留的代碼塊,我需要用c#重寫:
我有一個遺留的代碼塊。
Dim dif As Integer
Dim rstTemp As ADODB.Resultset
Set rstTemp = database.OpenRecordset("select * from TABLE order by VALUE desc" /span>)
Set dif = <input>
Do Until dif = 0.
rstTemp.Fields("VALUE") = rstTemp.Fields("VALUE") - 1
rstTemp.Update
rstTemp.MoveNext
dif = dif - 1 1 rstTemp.MoveNext
回圈。
沒有檢查rstTemp.EOF,所以在我看來,更新在迭代程序中改變了迭代順序,它總是跳到第一個? 差異可能比記錄的數量大得多,所以它必須以某種方式回圈自己。 這段C#代碼是否等同于?
int dif = <input> 。
while (dif != 0)
{
var record = _context.TABLE.OrderByDescending(x => x.VALUE).First();
record.VALUE--。
_context.SaveChanges();
dif--。
}
uj5u.com熱心網友回復:
這段代碼是非常不同的;在舊的(VB6?)版本中,你查詢一次;在C#版本中,它可能查詢一次(如果_context點了某種快取優化),但它可能(也可能會)查詢每次回圈迭代一次 - 而且它幾乎每次都會得到同一行,而不是從查詢的連續記錄。至少,你可以嘗試:
int dif = <input> 。
foreach (var record in _context. TABLE.OrderByDescending(x => x.VALUE).Take(dif))
{
record.VALUE--。
_context.SaveChanges()。
if (--dif == 0) break;
}
然而,由于批處理的作業方式,可能在最后只做一個SaveChanges()更合理。
至于您的實際問題,我認為它與ORDER BY和正在進行的更新的互動有關;這將在很大程度上取決于隔離級別和其他設定;我只能說 "可能不會,但是......也許"!
在這里,也許真正的訣竅在于理解SaveChanges()。也許這里真正的訣竅是理解原始代碼想要實作什么(而不是它如何做到這一點)。特別是,這似乎是可以完全卸載到服務器端的東西,而不需要通過網路獲取記錄--用適當的SQL來處理。這也將給你帶來更好的原子性,而不會有大量的往返開銷導致長期運行的事務。
uj5u.com熱心網友回復:
好吧,我發現它在迭代程序中沒有變化,"dif "值被另一個執行緒改變,所以它永遠不會運行EOF......
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/333682.html
標籤:
上一篇:對一個物件進行通用決議
