简体   繁体   中英

Asynchronous LINQ

I was looking for an async .Where() but could not find one so after some research I've created one.

public static class LinqExtension
{
    public static async Task<IEnumerable<T>> WhereAsync<T>(this IEnumerable<T> source, Func<T, Task<bool>> @delegate)
    {
        var tasks = source.Select(async t => new
        {
            Predicate = await @delegate(t).ConfigureAwait(false),
            Value = t
        }).ToList();

        var results = await Task.WhenAll(tasks).ConfigureAwait(false);

        IEnumerable<T> typeList = results.Where(pred => pred.Predicate).Select(val => val.Value);
        return typeList;
    }
}

When I try to use it i get runtime error

Cannot convert implicit type bool to Task and yes it's correct

This is how I've tried

var q = await context.StockHistories.WhereAsync(x => x.ProductId == productId);

I've tried

context.StockHistories.WhereAsync(Task.Run(() => { x => x.ProductId == productId; }));

but getting

Only assignment, call, increment, decrement, and new object expressions can be used as a statement

Can please someone provide a solution and explain what I am doing wrong?

The async methods for EF are the ones that execute the query. So what you actually want is

var q = await context.StockHistories.Where(x => x.ProductId == productId).ToListAsync();

Basically there isn't an asynchronous Where method because it doesn't make sense to have one because it's just used to generate the actual SQL that will be executed on the DB. The query isn't actually run until you iterate the results, and all the methods that do that have an asynchronous version.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM