private void CreateIndexes(Configuration config, Collection collection) { if(collection.Element is ManyToOne) { // many-to-many collection // collect all columns that participate in foreign keys HybridSet columns = new HybridSet(); foreach (ForeignKey fk in collection.CollectionTable.ForeignKeyIterator) { CollectionUtils.ForEach(fk.ColumnIterator, delegate(Column col) { columns.Add(col); }); } // there should always be exactly 2 "foreign key' columns in a many-many join table, AFAIK if (columns.Count != 2) { throw new Exception("SNAFU"); } List<Column> indexColumns = new List<Column>(new TypeSafeEnumerableWrapper<Column>(columns)); // create two indexes, each containing both columns, going in both directions CreateIndex(collection.CollectionTable, indexColumns); indexColumns.Reverse(); CreateIndex(collection.CollectionTable, indexColumns); } else { // this is a value collection, or a one-to-many collection // find the foreign-key that refers back to the owner table (assume there is only one of these - is this always true??) ForeignKey foreignKey = CollectionUtils.SelectFirst<ForeignKey>(collection.CollectionTable.ForeignKeyIterator, delegate (ForeignKey fk) { return Equals(fk.ReferencedTable, collection.Table); }); // create an index on all columns in this foreign key if(foreignKey != null) { CreateIndex(collection.CollectionTable, new TypeSafeEnumerableWrapper<Column>(foreignKey.ColumnIterator)); } } }