expresiones - ordenar en linq
Cómo esperar un método en una consulta de Linq (2)
Tratando de usar la palabra clave LINQ
en una consulta LINQ
y obtengo esto:
El operador ''en espera'' solo puede usarse en una expresión de consulta dentro de la primera expresión de recopilación de la cláusula ''de'' inicial o dentro de la expresión de recopilación de una cláusula ''unirse''
Código de muestra:
var data = (from id in ids
let d = await LoadDataAsync(id)
select d);
¿No es posible esperar algo en una consulta LINQ
, o necesita estructurarse de otra manera?
Puede definir algunas operaciones de sincronización asíncrona usted mismo (para linq a los objetos): por ejemplo: puede escribir su propio método de extensión WhereAsync:
public static async Task<IEnumerable<T>> WhereAsync<T>(
this IEnumerable<T> target, Func<T, Task<bool>> predicateAsync)
{
var tasks = target.Select(async x => new { Predicate = await predicateAsync(x).ConfigureAwait(false), Value = x }).ToArray();
var results = await Task.WhenAll(tasks).ConfigureAwait(false);
return results.Where(x => x.Predicate).Select(x => x.Value);
}
Y úsalo así:
var ints = new List<int> { 1, 2, 3 };
var smallInts = await ints.WhereAsync(IsSmallIntAsync);
LINQ tiene soporte muy limitado para async
/ await
. Para LINQ-to-objects, la única operación realmente útil que conozco es hacer una Select
con un delegado async
(que da como resultado una secuencia de tareas).
List<T> data = new List<T>();
foreach (var id in ids)
data.Add(await LoadDataAsync(id));
Si puede hacer LoadDataAsync
en paralelo de manera segura, su ejemplo podría reescribirse como:
T[] data = await Task.WhenAll(ids.Select(id => LoadDataAsync(id)));