Cedric VH
Cedric VH

Reputation: 13

Convert method to async

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.

Upvotes: 0

Views: 174

Answers (1)

Hans Kesting
Hans Kesting

Reputation: 39274

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.

Upvotes: 2

Related Questions