Skip to content

Commit e6d2802

Browse files
authored
(#46) Flatten Nested Properties
1 parent ad2f0be commit e6d2802

6 files changed

Lines changed: 65 additions & 0 deletions

File tree

src/EntityFrameworkCore.SqlServer.SimpleBulks/BulkDelete/BulkDeleteBuilder.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,22 @@ public BulkDeleteBuilder(ConnectionContext connectionContext)
2424
public BulkDeleteBuilder<T> ToTable(TableInfor<T> table)
2525
{
2626
_table = table;
27+
_deleteKeys = _table?.FlattenProperties(_deleteKeys) ?? _deleteKeys;
2728
return this;
2829
}
2930

3031
public BulkDeleteBuilder<T> WithId(IReadOnlyCollection<string> idColumns)
3132
{
3233
_deleteKeys = idColumns;
34+
_deleteKeys = _table?.FlattenProperties(_deleteKeys) ?? _deleteKeys;
3335
return this;
3436
}
3537

3638
public BulkDeleteBuilder<T> WithId(Expression<Func<T, object>> idSelector)
3739
{
3840
var idColumn = idSelector.Body.GetMemberName();
3941
_deleteKeys = string.IsNullOrEmpty(idColumn) ? idSelector.Body.GetMemberNames() : new List<string> { idColumn };
42+
_deleteKeys = _table?.FlattenProperties(_deleteKeys) ?? _deleteKeys;
4043
return this;
4144
}
4245

src/EntityFrameworkCore.SqlServer.SimpleBulks/BulkInsert/BulkInsertBuilder.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,21 @@ public BulkInsertBuilder<T> ToTable(TableInfor<T> table)
3030
_table = table;
3131
_outputIdColumn = table?.OutputId?.Name;
3232
_outputIdMode = table?.OutputId?.Mode ?? OutputIdMode.ServerGenerated;
33+
_columnNames = _table?.FlattenProperties(_columnNames) ?? _columnNames;
3334
return this;
3435
}
3536

3637
public BulkInsertBuilder<T> WithColumns(IReadOnlyCollection<string> columnNames)
3738
{
3839
_columnNames = columnNames;
40+
_columnNames = _table?.FlattenProperties(_columnNames) ?? _columnNames;
3941
return this;
4042
}
4143

4244
public BulkInsertBuilder<T> WithColumns(Expression<Func<T, object>> columnNamesSelector)
4345
{
4446
_columnNames = columnNamesSelector.Body.GetMemberNames().ToArray();
47+
_columnNames = _table?.FlattenProperties(_columnNames) ?? _columnNames;
4548
return this;
4649
}
4750

src/EntityFrameworkCore.SqlServer.SimpleBulks/BulkMatch/BulkMatchBuilder.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,37 @@ public BulkMatchBuilder(ConnectionContext connectionContext)
2626
public BulkMatchBuilder<T> WithTable(TableInfor<T> table)
2727
{
2828
_table = table;
29+
_matchKeys = _table?.FlattenProperties(_matchKeys) ?? _matchKeys;
30+
_returnedColumns = _table?.FlattenProperties(_returnedColumns) ?? _returnedColumns;
2931
return this;
3032
}
3133

3234
public BulkMatchBuilder<T> WithMatchedColumns(IReadOnlyCollection<string> matchedColumns)
3335
{
3436
_matchKeys = matchedColumns;
37+
_matchKeys = _table?.FlattenProperties(_matchKeys) ?? _matchKeys;
3538
return this;
3639
}
3740

3841
public BulkMatchBuilder<T> WithMatchedColumns(Expression<Func<T, object>> matchedColumnsSelector)
3942
{
4043
var matchedColumn = matchedColumnsSelector.Body.GetMemberName();
4144
_matchKeys = string.IsNullOrEmpty(matchedColumn) ? matchedColumnsSelector.Body.GetMemberNames() : new List<string> { matchedColumn };
45+
_matchKeys = _table?.FlattenProperties(_matchKeys) ?? _matchKeys;
4246
return this;
4347
}
4448

4549
public BulkMatchBuilder<T> WithReturnedColumns(IReadOnlyCollection<string> returnedColumns)
4650
{
4751
_returnedColumns = returnedColumns;
52+
_returnedColumns = _table?.FlattenProperties(_returnedColumns) ?? _returnedColumns;
4853
return this;
4954
}
5055

5156
public BulkMatchBuilder<T> WithReturnedColumns(Expression<Func<T, object>> returnedColumnsSelector)
5257
{
5358
_returnedColumns = returnedColumnsSelector.Body.GetMemberNames().ToArray();
59+
_returnedColumns = _table?.FlattenProperties(_returnedColumns) ?? _returnedColumns;
5460
return this;
5561
}
5662

src/EntityFrameworkCore.SqlServer.SimpleBulks/BulkMerge/BulkMergeBuilder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,43 +31,53 @@ public BulkMergeBuilder<T> ToTable(TableInfor<T> table)
3131

3232
_outputIdColumn = table?.OutputId?.Name;
3333

34+
_mergeKeys = _table?.FlattenProperties(_mergeKeys) ?? _mergeKeys;
35+
_updateColumnNames = _table?.FlattenProperties(_updateColumnNames) ?? _updateColumnNames;
36+
_insertColumnNames = _table?.FlattenProperties(_insertColumnNames) ?? _insertColumnNames;
37+
3438
return this;
3539
}
3640

3741
public BulkMergeBuilder<T> WithId(IReadOnlyCollection<string> idColumns)
3842
{
3943
_mergeKeys = idColumns;
44+
_mergeKeys = _table?.FlattenProperties(_mergeKeys) ?? _mergeKeys;
4045
return this;
4146
}
4247

4348
public BulkMergeBuilder<T> WithId(Expression<Func<T, object>> idSelector)
4449
{
4550
var idColumn = idSelector.Body.GetMemberName();
4651
_mergeKeys = string.IsNullOrEmpty(idColumn) ? idSelector.Body.GetMemberNames() : new List<string> { idColumn };
52+
_mergeKeys = _table?.FlattenProperties(_mergeKeys) ?? _mergeKeys;
4753
return this;
4854
}
4955

5056
public BulkMergeBuilder<T> WithUpdateColumns(IReadOnlyCollection<string> updateColumnNames)
5157
{
5258
_updateColumnNames = updateColumnNames;
59+
_updateColumnNames = _table?.FlattenProperties(_updateColumnNames) ?? _updateColumnNames;
5360
return this;
5461
}
5562

5663
public BulkMergeBuilder<T> WithUpdateColumns(Expression<Func<T, object>> updateColumnNamesSelector)
5764
{
5865
_updateColumnNames = updateColumnNamesSelector.Body.GetMemberNames().ToArray();
66+
_updateColumnNames = _table?.FlattenProperties(_updateColumnNames) ?? _updateColumnNames;
5967
return this;
6068
}
6169

6270
public BulkMergeBuilder<T> WithInsertColumns(IReadOnlyCollection<string> insertColumnNames)
6371
{
6472
_insertColumnNames = insertColumnNames;
73+
_insertColumnNames = _table?.FlattenProperties(_insertColumnNames) ?? _insertColumnNames;
6574
return this;
6675
}
6776

6877
public BulkMergeBuilder<T> WithInsertColumns(Expression<Func<T, object>> insertColumnNamesSelector)
6978
{
7079
_insertColumnNames = insertColumnNamesSelector.Body.GetMemberNames().ToArray();
80+
_insertColumnNames = _table?.FlattenProperties(_insertColumnNames) ?? _insertColumnNames;
7181
return this;
7282
}
7383

src/EntityFrameworkCore.SqlServer.SimpleBulks/BulkUpdate/BulkUpdateBuilder.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,31 +26,37 @@ public BulkUpdateBuilder(ConnectionContext connectionContext)
2626
public BulkUpdateBuilder<T> ToTable(TableInfor<T> table)
2727
{
2828
_table = table;
29+
_updateKeys = _table?.FlattenProperties(_updateKeys) ?? _updateKeys;
30+
_columnNames = _table?.FlattenProperties(_columnNames) ?? _columnNames;
2931
return this;
3032
}
3133

3234
public BulkUpdateBuilder<T> WithId(IReadOnlyCollection<string> idColumns)
3335
{
3436
_updateKeys = idColumns;
37+
_updateKeys = _table?.FlattenProperties(_updateKeys) ?? _updateKeys;
3538
return this;
3639
}
3740

3841
public BulkUpdateBuilder<T> WithId(Expression<Func<T, object>> idSelector)
3942
{
4043
var idColumn = idSelector.Body.GetMemberName();
4144
_updateKeys = string.IsNullOrEmpty(idColumn) ? idSelector.Body.GetMemberNames() : new List<string> { idColumn };
45+
_updateKeys = _table?.FlattenProperties(_updateKeys) ?? _updateKeys;
4246
return this;
4347
}
4448

4549
public BulkUpdateBuilder<T> WithColumns(IReadOnlyCollection<string> columnNames)
4650
{
4751
_columnNames = columnNames;
52+
_columnNames = _table?.FlattenProperties(_columnNames) ?? _columnNames;
4853
return this;
4954
}
5055

5156
public BulkUpdateBuilder<T> WithColumns(Expression<Func<T, object>> columnNamesSelector)
5257
{
5358
_columnNames = columnNamesSelector.Body.GetMemberNames().ToArray();
59+
_columnNames = _table?.FlattenProperties(_columnNames) ?? _columnNames;
5460
return this;
5561
}
5662

src/EntityFrameworkCore.SqlServer.SimpleBulks/TableInfor.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,43 @@ public string CreateSetClause(string prop, Func<SetClauseContext, string> config
101101

102102
return $"{left} = {right}";
103103
}
104+
105+
public IReadOnlyCollection<string> FlattenProperties(IReadOnlyCollection<string> propertyNames)
106+
{
107+
if (propertyNames == null || propertyNames.Count == 0)
108+
{
109+
return propertyNames;
110+
}
111+
112+
if (InsertablePropertyNames == null || InsertablePropertyNames.Count == 0)
113+
{
114+
return propertyNames;
115+
}
116+
117+
var flattenedProperties = new HashSet<string>(StringComparer.Ordinal);
118+
119+
foreach (var prop in propertyNames)
120+
{
121+
var prefix = prop + ".";
122+
var foundNested = false;
123+
124+
foreach (var insertableProp in InsertablePropertyNames)
125+
{
126+
if (insertableProp.StartsWith(prefix, StringComparison.Ordinal))
127+
{
128+
flattenedProperties.Add(insertableProp);
129+
foundNested = true;
130+
}
131+
}
132+
133+
if (!foundNested)
134+
{
135+
flattenedProperties.Add(prop);
136+
}
137+
}
138+
139+
return flattenedProperties;
140+
}
104141
}
105142

106143
public abstract class TableInfor<T> : TableInfor

0 commit comments

Comments
 (0)