public IEnumerable <TEntity> GetEntitiesByParent(string parentType, string parentId)
        {
            var snapshots = _snapshotStore.GetChildSnapshots <TSnapshot>(parentType, parentId);

            foreach (var snapshot in snapshots)
            {
                yield return(LoadEntityFromSnapshot(snapshot));
            }
        }
        private TransactionDictionary GroupTransactions()
        {
            var groupedTransactions   = new Dictionary <CategoryMonthKey, decimal>();
            var transacations         = _snapshotStore.GetAllSnapshots <TransactionSnapshot>().Where(t => !t.IsDeleted).ToList();
            var transactionReferences = transacations.Select(t => new EntityReference(nameof(Transaction), t.EntityID)).ToList();
            var subTransactionsLookup = _snapshotStore.GetChildSnapshots <SubTransactionSnapshot>(transactionReferences)?.ToDictionary(kvp => kvp.Key.EntityID, kvp => kvp.Value);

            foreach (var transaction in transacations)
            {
                if (transaction.TransactionType == TransactionTypes.Normal)
                {
                    CategoryMonthKey category = GetCategoryMonthKey(transaction);
                    if (category == null)
                    {
                        continue;
                    }

                    if (groupedTransactions.ContainsKey(category))
                    {
                        groupedTransactions[category] += GetTransactionAmount(transaction);
                    }
                    else
                    {
                        groupedTransactions[category] = GetTransactionAmount(transaction);
                    }
                }
                else if (transaction.TransactionType == TransactionTypes.SplitTransaction)
                {
                    if (subTransactionsLookup != null &&
                        subTransactionsLookup.TryGetValue(transaction.EntityID, out List <SubTransactionSnapshot> subTransactions))
                    {
                        foreach (var subTransaction in subTransactions)
                        {
                            CategoryMonthKey category = GetCategoryMonthKey(transaction, subTransaction);
                            if (category == null)
                            {
                                continue;
                            }

                            if (groupedTransactions.ContainsKey(category))
                            {
                                groupedTransactions[category] += GetTransactionAmount(subTransaction);
                            }
                            else
                            {
                                groupedTransactions[category] = GetTransactionAmount(subTransaction);
                            }
                        }
                    }
                }
            }

            return(groupedTransactions);
        }
        public IEnumerable <TEntity> GetEntitiesByParent(string parentType, string parentId)
        {
            var snapshots          = _snapshotStore.GetChildSnapshots <TSnapshot>(parentType, parentId).ToList();
            var subEntitySnapshots = GetSubEntitySnapshotLookup(snapshots);

            foreach (var snapshot in snapshots)
            {
                if (subEntitySnapshots == null)
                {
                    yield return(LoadEntityFromSnapshot(snapshot, null));
                }
                else
                {
                    EntityReference       snapshotReference = new EntityReference(typeof(TEntity).Name, snapshot.EntityID);
                    List <EntitySnapshot> subEntities       = null;
                    if (!subEntitySnapshots.TryGetValue(snapshotReference, out subEntities))
                    {
                        subEntities = new List <EntitySnapshot>();
                    }

                    yield return(LoadEntityFromSnapshot(snapshot, subEntities));
                }
            }
        }