#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, не?