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"); } }); }
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()); }