我在一個定義為...的類中有一個方法。
public static async Task<int> GetDCountAsync(int dId)
我正在嘗試在 LINQ Where 子句中呼叫此方法....
var excessD= dToConsider
.Where(async x => await myService.GetDCountAsync(x.Id) >= x.Threshold)
.Select(x => x.Id)
.ToArray();
僅供參考:閾值是一個整數。
我收到異步錯誤......
'async' 匿名函式的回傳型別必須是 'void', 'Task', 'Task', ......
GetDCountAsync 的回傳型別是異步任務。我哪里錯了?提前致謝!
uj5u.com熱心網友回復:
您可以使用System.Linq.Async包中已有的功能:
int[] excessD = await dToConsider
.ToAsyncEnumerable()
.WhereAwait(async x => await myService.GetDCountAsync(x.Id) >= x.Threshold)
.Select(x => x.Id)
.ToArrayAsync();
運營商簽名WhereAwait:
// Filters the elements of an async-enumerable sequence based on
// an asynchronous predicate.
public static IAsyncEnumerable<TSource> WhereAwait<TSource>(
this IAsyncEnumerable<TSource> source,
Func<TSource, ValueTask<bool>> predicate);
異步方法myService.GetDCountAsync將一次呼叫和await編輯一個元素,而不是同時為所有元素呼叫和編輯。
uj5u.com熱心網友回復:
因此,您收到的完整錯誤訊息將是:
無法將異步 lambda 運算式轉換為委托型別“Func<int, bool>”。異步 lambda 運算式可能回傳 void、Task 或 Task,它們都不能轉換為 'Func<int, bool>'。
它實際上告訴您的是 .Where() LINQ 呼叫需要一個 int,并回傳一個布林值。但是因為您正在嘗試進行異步呼叫,所以它正在嘗試回傳 Task。
或者換句話說,編譯器在說“我看到你在這里使用了一個異步方法,我知道異步方法只能回傳 void、Task 或 Task,而且我也知道這個 Where 方法需要回傳一個 bool,所以我知道現在這行不通”
部分問題是我們實際上并不知道 dToConsider 是什么型別,在某些情況下,它會尋求延遲執行。在任何情況下,因為您正在為 WHERE 陳述句執行自定義代碼邏輯,所以我們假設這不是 EntityFramework 或需要延遲的東西,并說它只是一個串列。在這種情況下,簡單地使用典型的 ForEach 回圈來過濾您的串列。
var filteredItems = new List<T>();
foreach(var item in dToConsider)
{
if(await myService.GetDCountAsync(x.Id) >= x.Threshold)
filteredItems.Add(item);
}
我相信有人可能會使用 Task.WhenAll 等為您提供一個很好的擴展方法,但這是完成您需要完成的最簡單的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471666.html
