var fdPositions = dbContext.FdPositions.Where(s => s.LastUpdated > DateTime.UtcNow.AddDays(-1));
foreach (JProperty market in markets)
{
// bunch of logic that is irrelevant here
var fdPosition = fdPositions.Where(s => s.Id == key).FirstOrDefault();
if (fdPosition is not null)
{
fdPosition.OddsDecimal = oddsDecimal;
fdPosition.LastUpdated = DateTime.UtcNow;
}
else
{
// bunch of logic that is irrelevant here
}
}
await dbContext.SaveChangesAsync();
此代碼塊將在此行上進行 1 次資料庫呼叫
var fdPosition = fdPositions.Where(s => s.Id == key).FirstOrDefault();
對于回圈中的每個值,將有大約 10,000 個markets回圈通過。
我認為會發生的,以及我希望發生的,是進行 1 次資料庫呼叫
var fdPositions = dbContext.FdPositions.Where(s => s.LastUpdated > DateTime.UtcNow.AddDays(-1));
在這一行,然后在回圈中,它正在檢查我認為我在第一行拉的本地表,確保我仍然正確地更新了本節中的資料庫物件
if (fdPosition is not null)
{
fdPosition.OddsDecimal = oddsDecimal;
fdPosition.LastUpdated = DateTime.UtcNow;
}
因此,當我呼叫時,我的資料會正確傳播到資料庫
await dbContext.SaveChangesAsync();
如何更新我的代碼以完成此操作,以便我進行 1 個 DB 呼叫來獲取我的資料,而不是 10,000 個 DB 呼叫?
uj5u.com熱心網友回復:
將 fdPositions 變數定義為 Dictionary<int, T>,在查詢中對 Id 執行 GroupBy(),然后呼叫 .ToDictionary()。現在您有了一個物化字典,可以讓您快速按鍵索引。
var fdPositions = context.FdPositions.Where(s => s.LastUpdatedAt > DateTime.UtcNow.AddDays(-1))
.GroupBy(x=> x.Id)
.ToDictionary(x=> x.Key, x=> x.First());
//inside foreach loop:
// bunch of logic that is irrelevant here
bool found = fdPositions.TryGetValue(key, out var item);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/513882.html
