Практическое руководство. Использование методов async с помощью метода расширения LINQ

У меня есть собственный метод расширения LINQ:

public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> items, Func<T, TKey> property)
{
    return items.GroupBy(property).Select(x => x.First());
}

И я использую его вот так:

var spc = context.pcs.DistinctBy(w => w.province).Select(w => new
            {
                abc = w
            }).ToList();

Но проблема в том, что я не хочу ToList() Я хочу что-то вроде этого

var spc = await context.pcs.DistinctBy(w => w.province).Select(w => new
             {
                 abc = w
             }).ToListAsync();

С Async. Но async не найден. Как я могу сделать свой собственный метод distinctBy таким, чтобы я мог также использовать его асинхронно?

Ответ 1

Метод расширения ToListAsync() расширяет IQueryable<T>, но ваш метод DistinctBy() расширяет (и возвращает) IEnumerable<T>.

Очевидно, что ToListAsync() недоступен для IEnumerable<T>, потому что он использует Linq-To-Objects (in-memory) и не может потенциально блокироваться (нет ввода-вывода).

Попробуйте это вместо:

public static IQueryable<T> DistinctBy<T, TKey>(this IQueryable<T> items, Expression<Func<T, TKey>> property)
{
    return items.GroupBy(property).Select(x => x.First());
}

Обратите внимание, что я также изменил параметр property с Func<> на Expression<Func<>>, чтобы соответствовать Queryable.GroupBy (и избегать Enumerable.GroupBy).

См. MSDN