Skip to content

Commit 3f99c8b

Browse files
committed
Get rid of duplicate column iteration in constructor plus avoiding reallocations in SqlTableRef
1 parent 7339ec3 commit 3f99c8b

1 file changed

Lines changed: 32 additions & 37 deletions

File tree

Orm/Xtensive.Orm/Sql/Dml/SqlTableRef.cs

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,75 +17,70 @@ namespace Xtensive.Sql.Dml
1717
[Serializable]
1818
public class SqlTableRef : SqlTable
1919
{
20-
private DataTable dataTable;
21-
2220
/// <summary>
2321
/// Gets the name of the instance.
2422
/// </summary>
2523
/// <value>The name.</value>
26-
public override string Name
27-
{
28-
get { return string.IsNullOrEmpty(base.Name) ? dataTable.DbName : base.Name; }
29-
}
24+
public override string Name => string.IsNullOrEmpty(base.Name) ? DataTable.DbName : base.Name;
3025

3126
/// <summary>
3227
/// Gets the referenced table.
3328
/// </summary>
3429
/// <value>The table.</value>
35-
public DataTable DataTable
36-
{
37-
get { return dataTable; }
38-
}
30+
public DataTable DataTable { get; private set; }
3931

4032
internal override object Clone(SqlNodeCloneContext context)
4133
{
42-
if (context.NodeMapping.ContainsKey(this))
34+
if (context.NodeMapping.ContainsKey(this)) {
4335
return context.NodeMapping[this];
36+
}
4437

45-
var clone = new SqlTableRef {Name = Name, dataTable = DataTable};
38+
var clone = new SqlTableRef {Name = Name, DataTable = DataTable};
4639
context.NodeMapping[this] = clone;
47-
var columnClones = new Collection<SqlTableColumn>();
48-
foreach (var column in columns)
49-
columnClones.Add((SqlTableColumn) column.Clone(context));
40+
var index = 0;
41+
var columnClones = new SqlTableColumn[columns.Count];
42+
foreach (var column in columns) {
43+
columnClones[index++] = (SqlTableColumn) column.Clone(context);
44+
}
45+
5046
clone.columns = new SqlTableColumnCollection(columnClones);
5147

5248
return clone;
5349
}
5450

55-
public override void AcceptVisitor(ISqlVisitor visitor)
56-
{
57-
visitor.Visit(this);
58-
}
59-
51+
public override void AcceptVisitor(ISqlVisitor visitor) => visitor.Visit(this);
6052

6153
// Constructors
6254

6355
private SqlTableRef()
64-
{
65-
}
56+
{ }
6657

6758
internal SqlTableRef(DataTable dataTable)
68-
: this(dataTable, string.Empty)
69-
{
70-
}
59+
: this(dataTable, string.Empty, Array.Empty<string>())
60+
{ }
7161

7262
internal SqlTableRef(DataTable dataTable, string name)
73-
: this(dataTable, name, ArrayUtils<string>.EmptyArray)
74-
{
75-
this.dataTable = dataTable;
76-
var tableColumns = new List<SqlTableColumn>();
77-
foreach (DataTableColumn c in dataTable.Columns)
78-
tableColumns.Add(SqlDml.TableColumn(this, c.Name));
79-
columns = new SqlTableColumnCollection(tableColumns);
80-
}
63+
: this(dataTable, name, Array.Empty<string>())
64+
{ }
8165

8266
internal SqlTableRef(DataTable dataTable, string name, params string[] columnNames)
8367
: base(name)
8468
{
85-
this.dataTable = dataTable;
86-
var tableColumns = columnNames.Length == 0
87-
? dataTable.Columns.Select(c => SqlDml.TableColumn(this, c.Name)).ToList()
88-
: columnNames.Select(cn => SqlDml.TableColumn(this, cn)).ToList();
69+
DataTable = dataTable;
70+
SqlTableColumn[] tableColumns;
71+
if (columnNames.Length == 0) {
72+
var index = 0;
73+
tableColumns = new SqlTableColumn[dataTable.Columns.Count];
74+
foreach (var column in dataTable.Columns) {
75+
tableColumns[index++] = SqlDml.TableColumn(this, column.Name);
76+
}
77+
}
78+
else {
79+
tableColumns = new SqlTableColumn[columnNames.Length];
80+
for (var index = 0; index < tableColumns.Length; index++) {
81+
tableColumns[index] = SqlDml.TableColumn(this, columnNames[index]);
82+
}
83+
}
8984
columns = new SqlTableColumnCollection(tableColumns);
9085
}
9186
}

0 commit comments

Comments
 (0)