[英]How to return LINQ result as a task
我有一個方法:
public Task<RequestPayinModel> InformationToSendPayInService(string qid)
{
var payInObject = dbcontext.PayoutEntities.Where(s => s.QID == qid).Select(s => new RequestPayinModel
{
IBAN = s.IBAN,
QID = s.QID,
Rate = s.Rate,
CollectionAmount = s.CollectionAmount,
SettelmentAmount = s.SettelmentAmount,
CollectionCurrency = s.CollectionCurrency,
SettelmentCurrency = s.SettelmentCurrency
});
return Task.FromResult(payInObject);
}
我收到一個錯誤,指出“System.Threading.Tasks.Task<System.Linq.IQueryable<Core.Models.RequestPayinModel>>”到“System.Threading.Tasks.Task<Core.Models.RequestPayinModel>”,有什么想法嗎?
實際上異步執行查詢的簡短答案是使用SingleOrDefaultAsync
或FirstOrDefaultAsync
:
public async Task<RequestPayinModel> InformationToSendPayInService(string qid)
{
var payInObject = await dbcontext.PayoutEntities
.Where(s => s.QID == qid)
.Select(s => new RequestPayinModel
{
IBAN = s.IBAN,
QID = s.QID,
Rate = s.Rate,
CollectionAmount = s.CollectionAmount,
SettelmentAmount = s.SettelmentAmount,
CollectionCurrency = s.CollectionCurrency,
SettelmentCurrency = s.SettelmentCurrency
})
.SingleOrDefaultAsync();
return payInObject;
}
返回已完成的任務以使同步方法看起來像異步方法是一個非常糟糕的主意。 調用者希望該方法能夠在無阻塞的情況下運行,如果它實際上阻塞,則可能會導致性能嚴重下降或死鎖。
返回Task
不會使方法異步執行。 添加async
也不行。 方法本身需要執行一個異步操作。
IQueryable<T>
是一個查詢,而不是它的結果。 我們需要使用ToList
、 Single
等或它們的異步等價物SingleAsync
、 FirstAsync
等來執行該查詢。
使用await
允許在不阻塞線程的情況下等待已經激活的異步操作。 一旦該操作完成,在await
表達式之后繼續執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.