コード例 #1
0
        public void AddForeignKeyConstraint <TForeignTableKey, TForeignTable>(
            Table <TForeignTableKey, TForeignTable> foreignTable,
            Expression <Func <TRow, TForeignTableKey> > foreignKeySelector)
        {
            var ourKeySelector = foreignKeySelector.Compile();

            _constraintManager.RegisterInsertUpdateConstraint(ourRow =>
            {
                var key = ourKeySelector(ourRow);

                var foreignRecordsAtOurKey = foreignTable._clusteredIndex.Seek(SeekTarget.From(key), Retrieval.Default);

                if (!foreignRecordsAtOurKey.Any())
                {
                    throw new Exception($"Key '{key}' does not exist in foreign table");
                }
            });

            CreateIndex(foreignKeySelector);

            foreignTable._constraintManager.RegisterDeleteConstraint(theirPrimaryKey =>
            {
                var index = _indexManager.FindIndex <TForeignTableKey, IIndex <TForeignTableKey, TRow> >(foreignKeySelector).Value;
                var ourRecordsAtTheirKey = index.Seek(SeekTarget.From(theirPrimaryKey), Retrieval.Default);
                if (ourRecordsAtTheirKey.Any())
                {
                    throw new Exception($"Can't delete '{theirPrimaryKey}' as a foreign table refers to it");
                }
            });
        }
コード例 #2
0
        public IEnumerable <TOut> QueryWithIndexSeek <TPredicateKey, TOut>(
            Expression <Func <TRow, TPredicateKey> > indexSelector,
            Func <TRow, TOut> select,
            IEnumerable <TPredicateKey> fromKeys,
            int?skip     = null,
            int?take     = null,
            bool reverse = false)
        {
            var index = _indexManager.FindIndex(indexSelector);

            if (!index.HasValue)
            {
                throw new Exception($"No index registered for key: '{Expressions.GetMemberName(indexSelector)}'");
            }

            return(index.Value.Seek(SeekTarget.From(fromKeys), new Retrieval(skip, take, reverse))
                   .Select(select)
                   .ToArray()
                   .AsEnumerable());
        }