@@ -113,17 +113,17 @@ protected override StorageModel VisitDomainModel(DomainModel domainModel)
113113 // Build hierarchy foreign keys
114114 var indexPairs = new Dictionary < Pair < IndexInfo > , object > ( ) ;
115115 foreach ( var type in domainModel . Types . Entities ) {
116- if ( type . Hierarchy == null || type . Hierarchy . InheritanceSchema == InheritanceSchema . ConcreteTable )
116+ if ( type . Hierarchy is null || type . Hierarchy . InheritanceSchema == InheritanceSchema . ConcreteTable )
117117 continue ;
118118 if ( type . Indexes . PrimaryIndex . IsVirtual ) {
119- Dictionary < TypeInfo , int > typeOrder = type . Ancestors
119+ var typeOrder = type . Ancestors
120120 . Append ( type )
121- . Select ( ( t , i ) => ( Type : t , Index : i ) )
122- . ToDictionary ( a => a . Type , a => a . Index ) ;
123- List < IndexInfo > realPrimaryIndexes = type . Indexes . RealPrimaryIndexes
121+ . Select ( static ( t , i ) => ( Type : t , Index : i ) )
122+ . ToDictionary ( static a => a . Type , static a => a . Index , capacity : type . Ancestors . Count ) ;
123+ var realPrimaryIndexes = type . Indexes . RealPrimaryIndexes
124124 . OrderBy ( index => typeOrder [ index . ReflectedType ] )
125- . ToList ( ) ;
126- for ( int i = 0 ; i < realPrimaryIndexes . Count - 1 ; i ++ ) {
125+ . ToArray ( type . Indexes . RealPrimaryIndexes . Count ) ;
126+ for ( int i = 0 , edge = realPrimaryIndexes . Length - 1 ; i < edge ; i ++ ) {
127127 if ( realPrimaryIndexes [ i ] != realPrimaryIndexes [ i + 1 ] ) {
128128 var pair = new Pair < IndexInfo > ( realPrimaryIndexes [ i ] , realPrimaryIndexes [ i + 1 ] ) ;
129129 indexPairs [ pair ] = null ;
@@ -137,7 +137,7 @@ protected override StorageModel VisitDomainModel(DomainModel domainModel)
137137 var referencingTable = targetModel . Tables [ resolver . GetNodeName ( referencingIndex . ReflectedType ) ] ;
138138 var referencedTable = targetModel . Tables [ resolver . GetNodeName ( referencedIndex . ReflectedType ) ] ;
139139 var storageReferencingIndex = FindIndex (
140- referencingTable , referencingIndex . KeyColumns . Select ( ci => ci . Key . Name ) . ToList ( ) ) ;
140+ referencingTable , referencingIndex . KeyColumns . Select ( static ci => ci . Key . Name ) . ToArray ( ) ) ;
141141
142142 string foreignKeyName = nameBuilder . BuildHierarchyForeignKeyName ( referencingIndex . ReflectedType , referencedIndex . ReflectedType ) ;
143143 CreateHierarchyForeignKey ( referencingTable , referencedTable , storageReferencingIndex , foreignKeyName ) ;
@@ -320,19 +320,19 @@ private PrimaryIndexInfo VisitPrimaryIndexInfo(IndexInfo index)
320320 return primaryIndex ;
321321 }
322322
323- private IEnumerable < TableInfo > CreateTables ( IndexInfo index )
323+ private IReadOnlyList < TableInfo > CreateTables ( IndexInfo index )
324324 {
325- var result = new List < TableInfo > ( ) ;
326325 var type = index . ReflectedType ;
327- if ( configuration . IsMultidatabase && type . UnderlyingType . Namespace == MetadataNamespace ) {
326+ if ( configuration . IsMultidatabase && type . UnderlyingType . Namespace == MetadataNamespace ) {
327+ var parts = new List < TableInfo > ( sourceModel . Databases . Count ) ;
328328 foreach ( var db in sourceModel . Databases ) {
329329 var name = resolver . GetNodeName ( db . Name , type . MappingSchema , type . MappingName ) ;
330- result . Add ( new TableInfo ( targetModel , name ) ) ;
330+ parts . Add ( new TableInfo ( targetModel , name ) ) ;
331331 }
332+ return parts ;
332333 }
333334 else
334- result . Add ( new TableInfo ( targetModel , resolver . GetNodeName ( type ) ) ) ;
335- return result ;
335+ return new [ ] { new TableInfo ( targetModel , resolver . GetNodeName ( type ) ) } ;
336336 }
337337
338338 #region Not supported
@@ -401,17 +401,24 @@ private string GetColumnDefaultSqlExpression(ColumnInfo column)
401401
402402 private static StorageIndexInfo FindIndex ( TableInfo table , ICollection < string > keyColumns )
403403 {
404- var primaryKeyColumns = table . PrimaryIndex . KeyColumns . Select ( cr => cr . Value . Name ) . ToList ( ) ;
404+ var primaryIndex = table . PrimaryIndex ;
405+ var primaryKeyColumns = primaryIndex . KeyColumns . Select ( ColumnNameSelector ) . ToList ( primaryIndex . KeyColumns . Count ) ;
405406
406407 if ( ! primaryKeyColumns . Except ( keyColumns ) . Union ( keyColumns . Except ( primaryKeyColumns ) ) . Any ( ) )
407408 return table . PrimaryIndex ;
408409
409410 foreach ( SecondaryIndexInfo index in table . SecondaryIndexes ) {
410- var secondaryKeyColumns = index . KeyColumns . Select ( cr => cr . Value . Name ) . ToList ( ) ;
411+ var secondaryKeyColumns = index . KeyColumns . Select ( ColumnNameSelector ) . ToList ( index . KeyColumns . Count ) ;
411412 if ( ! secondaryKeyColumns . Except ( keyColumns ) . Union ( keyColumns . Except ( secondaryKeyColumns ) ) . Any ( ) )
412413 return index ;
413414 }
414415 return null ;
416+
417+
418+ static string ColumnNameSelector ( KeyColumnRef cr )
419+ {
420+ return cr . Value . Name ;
421+ }
415422 }
416423
417424 private TableInfo GetTable ( TypeInfo type )
@@ -440,7 +447,7 @@ private static string GetPrimaryIndexColumnName(IndexInfo primaryIndex, ColumnIn
440447
441448 private static void CreateReferenceForeignKey ( TableInfo referencingTable , TableInfo referencedTable , FieldInfo referencingField , string foreignKeyName )
442449 {
443- var foreignColumns = referencingField . Columns . Select ( column => referencingTable . Columns [ column . Name ] ) . ToList ( ) ;
450+ var foreignColumns = referencingField . Columns . SelectToArray ( column => referencingTable . Columns [ column . Name ] ) ;
444451 var foreignKey = new ForeignKeyInfo ( referencingTable , foreignKeyName ) {
445452 PrimaryKey = referencedTable . PrimaryIndex ,
446453 OnRemoveAction = ReferentialAction . None ,
0 commit comments