Поддержка асинхронных операций Linq в пользовательском IQueryProvider

#c# #linq #iqueryable #c#-8.0

#c# #linq #iqueryable #c #-8.0

Вопрос:

У меня есть пользовательская реализация IQueryProvider и IQueryable , и я должен обеспечить поддержку асинхронной операции. Я хочу предоставить такой метод, как ToArrayAsync singleAsync и т.д., Но я в замешательстве.

Для методов синхронизации все предоставляется System.Linq.Queryable классом, но для асинхронного ничего не доступно.

Я нашел System.Linq.Async.Queryable (https://www.nuget.org/packages/System.Linq .Async/), который указывает на этот репозиторий: https://github.com/dotnet/reactive , принадлежащий dot net.

Должен ли я добавить ссылку на этот пакет и реализовать IAsyncQueryable и IAsyncQueryProvider , как я сделал для версии синхронизации IQueryable ?

Это официальный способ?

Комментарии:

1. Я советую вам реализовать встроенный IAsyncEnumerable<T>.GetAsyncEnumerator

2. Спасибо, Алуан, на самом деле я уже внедрил IAsyncEnumerable для предоставления некоторых пользовательских асинхронных расширений, это означает, что я должен написать свои методы пользовательских расширений также для ToArrayAsync, FirstOrDefault и т. Д.? Для этого нет поддержки фреймворка?

3. Да, вы должны реализовать их самостоятельно, но это просто. public static async Task<List<T>> ToListAsync<T>(this IAsyncEnumerable<T> source) { var results = new List<T>(); await foreach (var element in source) results.Add(element); return results;

4. Или более общую версию, private static async Task<TCollection> ToCollectionAsync<T, TCollection>(this IAsyncEnumerable<T> source) where TCollection: new(), ICollection<T> { var results = new TCollection(); await foreach (var element in source) results.Add(element); return results; } а затем public static Task<List<T>> ToListAsync<T>(this IAsyncEnumerable<T> source) => ToCollectionAsync<T, List<T>>(source); , public static Task<HashSet<T>> ToHashSetAsync<T>(this IAsyncEnumerable<T> source) => ToCollectionAsync<T, HashSet<T>>(source); , и так далее для каждого типа коллекции, который вы хотите

5. Сейчас я не на своем компьютере, но если мне это понравится, я не смогу использовать эти расширения после вызова where, который возвращает IQueryable, не?