我正在嘗試使此方法異步。
我發現了與我的問題相關的帖子(您可能認為這是重復的),我不確定如何將它們應用于此方法。
可以使用一些幫助。
public async Task<IEnumerable<E2307DetailsViewModel>> GetE2307Details(long headerID)
{
// it's slow here; takes a lot of steps when finding the header Id
var E2307Details = await entities.AP_SUPPLIER_2307.AsEnumerable().Where(x => x.AP_2307_HDR_ID == headerID).Select(x => new E2307DetailsViewModel
{
APSupplier2307ID = x.AP_SUPPLIER_2307_ID,
AP2307HeaderID = x.AP_2307_HDR_ID,
UploadFileID = x.UL_ID,
TransactionAPJEID = x.TRANS_APJE_ID,
TransactionDescription = x.TRANS_DESCRIPTION,
TransactionDate = x.TRANS_DATE,
ReferenceNo = x.REFERENCE_NO,
InvoiceNo = x.INVOICE_NO,
ATCCode = x.ATC_CODE,
TaxRate = x.TAX_RATE,
AmtOfTaxWithHeld = x.AMOUNT_OF_TAX_WITHHELD,
ForTheMonthOf = GetUploadFileDetails(x.UL_ID).FOR_THE_MONTH_OF,
IncomePayment = x.AMOUNT_OF_TAX_WITHHELD / (x.TAX_RATE / 100),
MonthNo = GetUploadFileDetails(x.UL_ID).FOR_THE_MONTH_OF_NO.GetValueOrDefault(0),
NatureOfPayment = GetTaxCode().FirstOrDefault(y => y.ATCCode == x.ATC_CODE).NatureOfPayment,
ForTheYearOf = GetUploadFileDetails(x.UL_ID).FOR_THE_YEAR
});
return E2307Details;
}
編輯:我嘗試用“FirstOrDefaultAsync”替換“Where”,但它說
IEnumerable<AP_Supplier_2307> 不包含“FirstOrDefaultAsync”的定義
編輯:當我在除錯模式下檢查并嘗試“步入”時,這段代碼花費了太多時間,Where(x => x.AP_2307_HDR_ID == headerID)因此我試圖使這個方法異步。
uj5u.com熱心網友回復:
您可能需要像這樣重寫方法:
public async Task<IEnumerable<E2307DetailsViewModel>> GetE2307Details(long headerID)
{
// it's slow here; takes a lot of steps when finding the header Id
var E2307Details = (await entities.AP_SUPPLIER_2307.Where(x => x.AP_2307_HDR_ID == headerID).ToListAsync())
.Select(x => new E2307DetailsViewModel
{
APSupplier2307ID = x.AP_SUPPLIER_2307_ID,
AP2307HeaderID = x.AP_2307_HDR_ID,
UploadFileID = x.UL_ID,
TransactionAPJEID = x.TRANS_APJE_ID,
TransactionDescription = x.TRANS_DESCRIPTION,
TransactionDate = x.TRANS_DATE,
ReferenceNo = x.REFERENCE_NO,
InvoiceNo = x.INVOICE_NO,
ATCCode = x.ATC_CODE,
TaxRate = x.TAX_RATE,
AmtOfTaxWithHeld = x.AMOUNT_OF_TAX_WITHHELD,
ForTheMonthOf = GetUploadFileDetails(x.UL_ID).FOR_THE_MONTH_OF,
IncomePayment = x.AMOUNT_OF_TAX_WITHHELD / (x.TAX_RATE / 100),
MonthNo = GetUploadFileDetails(x.UL_ID).FOR_THE_MONTH_OF_NO.GetValueOrDefault(0),
NatureOfPayment = GetTaxCode().FirstOrDefault(y => y.ATCCode == x.ATC_CODE).NatureOfPayment,
ForTheYearOf = GetUploadFileDetails(x.UL_ID).FOR_THE_YEAR
});
return E2307Details;
}
變化:
- 我洗掉了AsEnumerable,以便在資料庫中執行WHERE
- 然后添加了一個 ToListAsync,它異步獲取所有匹配的記錄
- 前一個運算式周圍有一對額外的 ( ),以便 Select 在 List 上作業,而不是在 Task 上作業(它不起作用)
評論
- 現在,您
GetUploadFileDetails(x.UL_ID)每條記錄呼叫 3 次。那可能可以優化。 - 您可能希望
.ToList()在該查詢的末尾添加另一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/493912.html
上一篇:DartFuture:拋出Error時,主執行緒被中斷,但在Flutter中不是
下一篇:判斷jszip異步功能何時完成
