Да, мы удалили IEnumerable из надежных коллекций в выпуске GA. Как упоминает Аллан Т., надежные коллекции на самом деле не такие, как обычные коллекции .NET, хотя они представляют одни и те же фундаментальные структуры данных. Одно из больших отличий, которое вы, вероятно, заметили, заключается в том, что все операции являются асинхронными из-за блокировки семантики и операций ввода-вывода для репликации и чтения с диска. Именно последняя часть привела к решению удалить IEnumerable, потому что он строго синхронен, а мы нет. Вместо этого мы теперь используем IAsyncEnumerable, который пока не поддерживает полный набор методов расширения LINQ.
Мы работаем над асинхронными методами расширения LINQ, но пока есть несколько способов работы с IAsyncEnumerable.
У Эли Арбеля есть асинхронные методы расширения в Gist, которые обеспечивают мост к System.Interactive.Async, а также асинхронные реализации Select, SelectMany и Where.
Или вы можете оберните IAsyncEnumerable в обычный IEnumerable, который просто оборачивает асинхронные вызовы синхронными методами, и это снова даст вам полный набор методов расширений LINQ. Затем вы можете использовать метод расширения в обычном запросе LINQ:
using (ITransaction tx = this.StateManager.CreateTransaction())
{
var x = from item in (await clusterDictionary.CreateEnumerableAsync(tx)).ToEnumerable()
where item.Value.Status == ClusterStatus.Ready
orderby item.Value.CreatedOn descending
select new ClusterView(
item.Key,
item.Value.AppCount,
item.Value.ServiceCount,
item.Value.Users.Count(),
this.config.MaximumUsersPerCluster,
this.config.MaximumClusterUptime - (DateTimeOffset.UtcNow - item.Value.CreatedOn.ToUniversalTime()));
}
person
Vaclav Turecek
schedule
27.04.2016