using Raven.Client.Documents.Indexes; using Raven.Client.Documents.Linq; namespace zero.Collections; public abstract partial class CollectionOperations { /// public virtual async Task Load(string id, string changeVector = null) where T : ZeroIdEntity, new() { if (id.IsNullOrWhiteSpace()) { return default; } if (!changeVector.IsNullOrEmpty()) { //return WhenActive(await GetRevision(changeVector)); // TODO } return WhenActive(await Session.LoadAsync(id)); } /// public virtual async Task> Load(IEnumerable ids) where T : ZeroIdEntity, new() { ids = ids.Distinct().ToArray(); Dictionary models = await Session.LoadAsync(ids); Dictionary result = new(); foreach (string id in ids) { models.TryGetValue(id, out T model); result.Add(id, WhenActive(model)); } return result; } /// public virtual async Task> Load(ListQuery query) where T : ZeroIdEntity, new() { return await Session.Query().FilterAsync(query); } /// public virtual async Task> Load(ListQuery query) where T : ZeroIdEntity, new() where TIndex : AbstractCommonApiForIndexes, new() { return await Session.Query().FilterAsync(query); } /// public virtual async Task> LoadAll() where T : ZeroIdEntity, new() { List items = new(); await foreach (T item in Stream()) { items.Add(item); } return items; } /// public virtual IAsyncEnumerable Stream() where T : ZeroIdEntity, new() => Stream(null); /// public virtual async IAsyncEnumerable Stream(Func, IRavenQueryable> expression) where T : ZeroIdEntity, new() { IRavenQueryable query = Session.Query(); if (expression != null) { query = expression(query); } var stream = await Session.Advanced.StreamAsync(query); while (await stream.MoveNextAsync()) { if (WhenActive(stream.Current.Document) == default) { continue; } yield return stream.Current.Document; } } }