将方法转换为异步

发布于 2025-02-08 16:08:08 字数 1647 浏览 1 评论 0原文

我正在尝试使这种方法异步。

我发现了与我的问题有关的帖子(您可能认为这是重复的),我不确定如何将它们应用于此方法。

可以使用一些帮助。

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”代替“哪里”,但它说

iEnumerable&lt; ap_supplier_2307&gt;不包含定义 'firstordEfaultAsync'

编辑:当我在调试模式上检查此并尝试“步入”时,在此代码中需要太多时间,其中(x =&gt; x.ap_2307_hdr_id == headerid = headerid)因此,为什么我为什么我为什么'试图使这种方法异步。

I'm trying to make this method asynchronous.

I found posts related to my question ( you might think this is duplicate) and I'm not sure how to apply them to this method.

Could use some help.

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;
}

Edit: I tried replacing 'Where' with 'FirstOrDefaultAsync' but it says

IEnumerable<AP_Supplier_2307> does not contain a definition for
'FirstOrDefaultAsync'

Edit: When I checked this on Debug mode and tried "Step Into", it takes too much time in this code Where(x => x.AP_2307_HDR_ID == headerID) hence why I'm trying to make this method async.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

宣告ˉ结束 2025-02-15 16:08:08

您可能需要重写这样的方法:

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;
    }

更改:

  • 我删除了可忽略的,以便在数据库中执行的位置,
  • 然后添加了一个tolistasync,以使所有匹配的记录都
  • 围绕上一个表达式获得所有匹配的记录,因此SELECT在列表上工作,而不是在任务(不起作用的任务)上

进行备注

  • ,您正在调用getUploadfiledEtails(X.UL_ID)每个记录3次。可能可以优化。
  • 您可能需要在该查询末尾添加另一个.tolist()

You may need to rewrite the method like this:

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;
    }

Changes:

  • I removed the AsEnumerable, so that the WHERE is executed in the database
  • Then added a ToListAsync, that asynchrounously gets all matching records
  • An extra pair of ( ) around the previous expression, so that the Select works on the List, not on a Task (where it doesn't work)

Remarks

  • Right now you are calling GetUploadFileDetails(x.UL_ID) three times per record. That can probably be optimized.
  • You may want to add another .ToList() at the end of that query.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文