Skip to content

Commit c73baf9

Browse files
authored
(#47) DataTableOptions
1 parent 58ec853 commit c73baf9

File tree

8 files changed

+172
-35
lines changed

8 files changed

+172
-35
lines changed

src/EntityFrameworkCore.SqlServer.SimpleBulks.Tests/IListExtensions/ToDataTableTests.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,11 @@ public Task ToDataTable_SingleKeyRow()
4141

4242
var valueConverters = _dbContext.GetValueConverters(typeof(SingleKeyRow<int>));
4343

44-
var dataTable = rows.ToDataTable(properties, valueConverters);
44+
var dataTable = rows.ToDataTable(new DataTableOptions
45+
{
46+
PropertyNames = properties,
47+
ValueConverters = valueConverters
48+
});
4549

4650
for (int i = 0; i < rows.Count; i++)
4751
{
@@ -92,7 +96,11 @@ public Task ToDataTable_CompositeKeyRow()
9296

9397
var valueConverters = _dbContext.GetValueConverters(typeof(CompositeKeyRow<int, int>));
9498

95-
var dataTable = rows.ToDataTable(properties, valueConverters);
99+
var dataTable = rows.ToDataTable(new DataTableOptions
100+
{
101+
PropertyNames = properties,
102+
ValueConverters = valueConverters
103+
});
96104

97105
for (int i = 0; i < rows.Count; i++)
98106
{
@@ -142,7 +150,11 @@ public Task ToDataTable_ColumnMapping()
142150
var columnNames = _dbContext.GetColumnNames(typeof(ConfigurationEntry));
143151
var columnTypes = _dbContext.GetColumnTypes(typeof(ConfigurationEntry));
144152

145-
var dataTable = rows.ToDataTable(properties, valueConverters);
153+
var dataTable = rows.ToDataTable(new DataTableOptions
154+
{
155+
PropertyNames = properties,
156+
ValueConverters = valueConverters
157+
});
146158

147159
for (int i = 0; i < rows.Count; i++)
148160
{
@@ -210,7 +222,10 @@ public Task ToDataTable_ComplexType()
210222
"ShippingAddress.Location.Lng"
211223
};
212224

213-
var dataTable = orders.ToDataTable(properties);
225+
var dataTable = orders.ToDataTable(new DataTableOptions
226+
{
227+
PropertyNames = properties
228+
});
214229

215230
for (int i = 0; i < orders.Count; i++)
216231
{
@@ -277,7 +292,10 @@ public Task ToDataTable_OwnedType()
277292
"ShippingAddress.Location.Lng"
278293
};
279294

280-
var dataTable = orders.ToDataTable(properties);
295+
var dataTable = orders.ToDataTable(new DataTableOptions
296+
{
297+
PropertyNames = properties
298+
});
281299

282300
for (int i = 0; i < orders.Count; i++)
283301
{

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,13 @@ public BulkDeleteResult Execute(IReadOnlyCollection<T> data)
8484
}
8585

8686
var temptableName = $"[#{Guid.NewGuid()}]";
87-
var dataTable = data.ToDataTable(_deleteKeys, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator);
87+
var dataTable = data.ToDataTable(new DataTableOptions
88+
{
89+
PropertyNames = _deleteKeys,
90+
ValueConverters = _table.ValueConverters,
91+
AddIndexNumberColumn = false,
92+
Discriminator = _table.Discriminator
93+
});
8894
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
8995

9096
var joinCondition = CreateJoinCondition(dataTable);
@@ -173,7 +179,13 @@ public async Task<BulkDeleteResult> ExecuteAsync(IReadOnlyCollection<T> data, Ca
173179
}
174180

175181
var temptableName = $"[#{Guid.NewGuid()}]";
176-
var dataTable = await data.ToDataTableAsync(_deleteKeys, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator, cancellationToken: cancellationToken);
182+
var dataTable = await data.ToDataTableAsync(new DataTableOptions
183+
{
184+
PropertyNames = _deleteKeys,
185+
ValueConverters = _table.ValueConverters,
186+
AddIndexNumberColumn = false,
187+
Discriminator = _table.Discriminator
188+
}, cancellationToken);
177189
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
178190

179191
var joinCondition = CreateJoinCondition(dataTable);

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

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,13 @@ public void Execute(IReadOnlyCollection<T> data)
7777
DataTable dataTable;
7878
if (!ReturnGeneratedId)
7979
{
80-
dataTable = data.ToDataTable(_columnNames, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator);
80+
dataTable = data.ToDataTable(new DataTableOptions
81+
{
82+
PropertyNames = _columnNames,
83+
ValueConverters = _table.ValueConverters,
84+
AddIndexNumberColumn = false,
85+
Discriminator = _table.Discriminator
86+
});
8187

8288
_connectionContext.EnsureOpen();
8389

@@ -95,7 +101,13 @@ public void Execute(IReadOnlyCollection<T> data)
95101
columnsToInsert.Add(_outputIdColumn);
96102
}
97103

98-
dataTable = data.ToDataTable(columnsToInsert, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator);
104+
dataTable = data.ToDataTable(new DataTableOptions
105+
{
106+
PropertyNames = columnsToInsert,
107+
ValueConverters = _table.ValueConverters,
108+
AddIndexNumberColumn = false,
109+
Discriminator = _table.Discriminator
110+
});
99111

100112
_connectionContext.EnsureOpen();
101113

@@ -124,7 +136,13 @@ public void Execute(IReadOnlyCollection<T> data)
124136
setId(row, SequentialGuidGenerator.Next(ref counter));
125137
}
126138

127-
dataTable = data.ToDataTable(columnsToInsert, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator);
139+
dataTable = data.ToDataTable(new DataTableOptions
140+
{
141+
PropertyNames = columnsToInsert,
142+
ValueConverters = _table.ValueConverters,
143+
AddIndexNumberColumn = false,
144+
Discriminator = _table.Discriminator
145+
});
128146

129147
_connectionContext.EnsureOpen();
130148

@@ -135,7 +153,13 @@ public void Execute(IReadOnlyCollection<T> data)
135153
}
136154

137155
var temptableName = $"[#{Guid.NewGuid()}]";
138-
dataTable = data.ToDataTable(_columnNames, valueConverters: _table.ValueConverters, addIndexNumberColumn: true, discriminator: _table.Discriminator);
156+
dataTable = data.ToDataTable(new DataTableOptions
157+
{
158+
PropertyNames = _columnNames,
159+
ValueConverters = _table.ValueConverters,
160+
AddIndexNumberColumn = true,
161+
Discriminator = _table.Discriminator
162+
});
139163
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
140164

141165
var mergeStatementBuilder = new StringBuilder();
@@ -293,7 +317,13 @@ public async Task ExecuteAsync(IReadOnlyCollection<T> data, CancellationToken ca
293317
DataTable dataTable;
294318
if (!ReturnGeneratedId)
295319
{
296-
dataTable = await data.ToDataTableAsync(_columnNames, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator, cancellationToken: cancellationToken);
320+
dataTable = await data.ToDataTableAsync(new DataTableOptions
321+
{
322+
PropertyNames = _columnNames,
323+
ValueConverters = _table.ValueConverters,
324+
AddIndexNumberColumn = false,
325+
Discriminator = _table.Discriminator
326+
}, cancellationToken);
297327

298328
await _connectionContext.EnsureOpenAsync(cancellationToken);
299329

@@ -311,7 +341,13 @@ public async Task ExecuteAsync(IReadOnlyCollection<T> data, CancellationToken ca
311341
columnsToInsert.Add(_outputIdColumn);
312342
}
313343

314-
dataTable = await data.ToDataTableAsync(columnsToInsert, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator, cancellationToken: cancellationToken);
344+
dataTable = await data.ToDataTableAsync(new DataTableOptions
345+
{
346+
PropertyNames = columnsToInsert,
347+
ValueConverters = _table.ValueConverters,
348+
AddIndexNumberColumn = false,
349+
Discriminator = _table.Discriminator
350+
}, cancellationToken);
315351

316352
await _connectionContext.EnsureOpenAsync(cancellationToken);
317353

@@ -340,7 +376,13 @@ public async Task ExecuteAsync(IReadOnlyCollection<T> data, CancellationToken ca
340376
setId(row, SequentialGuidGenerator.Next(ref counter));
341377
}
342378

343-
dataTable = await data.ToDataTableAsync(columnsToInsert, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator, cancellationToken: cancellationToken);
379+
dataTable = await data.ToDataTableAsync(new DataTableOptions
380+
{
381+
PropertyNames = columnsToInsert,
382+
ValueConverters = _table.ValueConverters,
383+
AddIndexNumberColumn = false,
384+
Discriminator = _table.Discriminator
385+
}, cancellationToken);
344386

345387
await _connectionContext.EnsureOpenAsync(cancellationToken);
346388

@@ -351,7 +393,13 @@ public async Task ExecuteAsync(IReadOnlyCollection<T> data, CancellationToken ca
351393
}
352394

353395
var temptableName = $"[#{Guid.NewGuid()}]";
354-
dataTable = await data.ToDataTableAsync(_columnNames, valueConverters: _table.ValueConverters, addIndexNumberColumn: true, discriminator: _table.Discriminator, cancellationToken: cancellationToken);
396+
dataTable = await data.ToDataTableAsync(new DataTableOptions
397+
{
398+
PropertyNames = _columnNames,
399+
ValueConverters = _table.ValueConverters,
400+
AddIndexNumberColumn = true,
401+
Discriminator = _table.Discriminator
402+
}, cancellationToken);
355403
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
356404

357405
var mergeStatementBuilder = new StringBuilder();

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,13 @@ public List<T> Execute(IReadOnlyCollection<T> machedValues)
9797
{
9898
var temptableName = $"[#{Guid.NewGuid()}]";
9999

100-
var dataTable = machedValues.ToDataTable(_matchKeys, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator);
100+
var dataTable = machedValues.ToDataTable(new DataTableOptions
101+
{
102+
PropertyNames = _matchKeys,
103+
ValueConverters = _table.ValueConverters,
104+
AddIndexNumberColumn = false,
105+
Discriminator = _table.Discriminator
106+
});
101107
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
102108

103109
var joinCondition = CreateJoinCondition(dataTable);
@@ -156,7 +162,13 @@ public async Task<List<T>> ExecuteAsync(IReadOnlyCollection<T> machedValues, Can
156162
{
157163
var temptableName = $"[#{Guid.NewGuid()}]";
158164

159-
var dataTable = await machedValues.ToDataTableAsync(_matchKeys, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator, cancellationToken: cancellationToken);
165+
var dataTable = await machedValues.ToDataTableAsync(new DataTableOptions
166+
{
167+
PropertyNames = _matchKeys,
168+
ValueConverters = _table.ValueConverters,
169+
AddIndexNumberColumn = false,
170+
Discriminator = _table.Discriminator
171+
}, cancellationToken);
160172
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
161173

162174
var joinCondition = CreateJoinCondition(dataTable);

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,13 @@ public BulkMergeResult Execute(IReadOnlyCollection<T> data)
179179
propertyNames.AddRange(_insertColumnNames);
180180
propertyNames = propertyNames.Distinct().ToList();
181181

182-
var dataTable = data.ToDataTable(propertyNames, valueConverters: _table.ValueConverters, addIndexNumberColumn: returnDbGeneratedId, discriminator: _table.Discriminator);
182+
var dataTable = data.ToDataTable(new DataTableOptions
183+
{
184+
PropertyNames = propertyNames,
185+
ValueConverters = _table.ValueConverters,
186+
AddIndexNumberColumn = returnDbGeneratedId,
187+
Discriminator = _table.Discriminator
188+
});
183189
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
184190

185191
var mergeStatementBuilder = new StringBuilder();
@@ -463,7 +469,13 @@ public async Task<BulkMergeResult> ExecuteAsync(IReadOnlyCollection<T> data, Can
463469
propertyNames.AddRange(_insertColumnNames);
464470
propertyNames = propertyNames.Distinct().ToList();
465471

466-
var dataTable = await data.ToDataTableAsync(propertyNames, valueConverters: _table.ValueConverters, addIndexNumberColumn: returnDbGeneratedId, discriminator: _table.Discriminator, cancellationToken: cancellationToken);
472+
var dataTable = await data.ToDataTableAsync(new DataTableOptions
473+
{
474+
PropertyNames = propertyNames,
475+
ValueConverters = _table.ValueConverters,
476+
AddIndexNumberColumn = returnDbGeneratedId,
477+
Discriminator = _table.Discriminator
478+
}, cancellationToken);
467479
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
468480

469481
var mergeStatementBuilder = new StringBuilder();

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,13 @@ public BulkUpdateResult Execute(IReadOnlyCollection<T> data)
140140
var propertyNamesIncludeId = _columnNames.ToList();
141141
propertyNamesIncludeId.AddRange(_updateKeys);
142142

143-
var dataTable = data.ToDataTable(propertyNamesIncludeId, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator);
143+
var dataTable = data.ToDataTable(new DataTableOptions
144+
{
145+
PropertyNames = propertyNamesIncludeId,
146+
ValueConverters = _table.ValueConverters,
147+
AddIndexNumberColumn = false,
148+
Discriminator = _table.Discriminator
149+
});
144150
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
145151

146152
var joinCondition = CreateJoinCondition(dataTable);
@@ -220,7 +226,13 @@ public async Task<BulkUpdateResult> ExecuteAsync(IReadOnlyCollection<T> data, Ca
220226
var propertyNamesIncludeId = _columnNames.ToList();
221227
propertyNamesIncludeId.AddRange(_updateKeys);
222228

223-
var dataTable = await data.ToDataTableAsync(propertyNamesIncludeId, valueConverters: _table.ValueConverters, discriminator: _table.Discriminator, cancellationToken: cancellationToken);
229+
var dataTable = await data.ToDataTableAsync(new DataTableOptions
230+
{
231+
PropertyNames = propertyNamesIncludeId,
232+
ValueConverters = _table.ValueConverters,
233+
AddIndexNumberColumn = false,
234+
Discriminator = _table.Discriminator
235+
}, cancellationToken);
224236
var sqlCreateTemptable = dataTable.GenerateTableDefinition(temptableName, null, _table.ColumnTypeMappings);
225237

226238
var joinCondition = CreateJoinCondition(dataTable);

src/EntityFrameworkCore.SqlServer.SimpleBulks/Extensions/IListExtensions.cs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,42 @@
77

88
namespace EntityFrameworkCore.SqlServer.SimpleBulks.Extensions;
99

10+
public readonly struct DataTableOptions
11+
{
12+
public IReadOnlyCollection<string> PropertyNames { get; init; }
13+
14+
public IReadOnlyDictionary<string, ValueConverter> ValueConverters { get; init; }
15+
16+
public bool AddIndexNumberColumn { get; init; }
17+
18+
public Discriminator Discriminator { get; init; }
19+
}
20+
1021
public static class IListExtensions
1122
{
12-
public static DataTable ToDataTable<T>(this IReadOnlyCollection<T> data, IReadOnlyCollection<string> propertyNames, IReadOnlyDictionary<string, ValueConverter> valueConverters = null, bool addIndexNumberColumn = false, Discriminator discriminator = null, CancellationToken cancellationToken = default)
23+
public static DataTable ToDataTable<T>(this IReadOnlyCollection<T> data, DataTableOptions options, CancellationToken cancellationToken = default)
1324
{
1425
cancellationToken.ThrowIfCancellationRequested();
1526

1627
var table = new DataTable() { MinimumCapacity = data.Count };
1728

18-
foreach (var propName in propertyNames)
29+
foreach (var propName in options.PropertyNames)
1930
{
2031
cancellationToken.ThrowIfCancellationRequested();
2132

22-
table.Columns.Add(propName, PropertiesCache<T>.GetPropertyUnderlyingType(propName, valueConverters));
33+
table.Columns.Add(propName, PropertiesCache<T>.GetPropertyUnderlyingType(propName, options.ValueConverters));
2334
}
2435

25-
if (addIndexNumberColumn)
36+
if (options.AddIndexNumberColumn)
2637
{
2738
table.Columns.Add(Constants.AutoGeneratedIndexNumberColumn, typeof(long));
2839
}
2940

30-
var hasDiscriminator = discriminator != null && !propertyNames.Contains(discriminator.PropertyName);
41+
var hasDiscriminator = options.Discriminator != null && !options.PropertyNames.Contains(options.Discriminator.PropertyName);
3142

3243
if (hasDiscriminator)
3344
{
34-
table.Columns.Add(discriminator.PropertyName, discriminator.PropertyType);
45+
table.Columns.Add(options.Discriminator.PropertyName, options.Discriminator.PropertyType);
3546
}
3647

3748
long idx = 0;
@@ -42,21 +53,21 @@ public static DataTable ToDataTable<T>(this IReadOnlyCollection<T> data, IReadOn
4253

4354
var row = table.NewRow();
4455

45-
foreach (var propName in propertyNames)
56+
foreach (var propName in options.PropertyNames)
4657
{
4758
cancellationToken.ThrowIfCancellationRequested();
4859

49-
row[propName] = PropertiesCache<T>.GetPropertyValue(propName, item, valueConverters) ?? DBNull.Value;
60+
row[propName] = PropertiesCache<T>.GetPropertyValue(propName, item, options.ValueConverters) ?? DBNull.Value;
5061
}
5162

52-
if (addIndexNumberColumn)
63+
if (options.AddIndexNumberColumn)
5364
{
5465
row[Constants.AutoGeneratedIndexNumberColumn] = idx;
5566
}
5667

5768
if (hasDiscriminator)
5869
{
59-
row[discriminator.PropertyName] = discriminator.PropertyValue ?? DBNull.Value;
70+
row[options.Discriminator.PropertyName] = options.Discriminator.PropertyValue ?? DBNull.Value;
6071
}
6172

6273
table.Rows.Add(row);
@@ -66,11 +77,11 @@ public static DataTable ToDataTable<T>(this IReadOnlyCollection<T> data, IReadOn
6677
return table;
6778
}
6879

69-
public static async Task<DataTable> ToDataTableAsync<T>(this IReadOnlyCollection<T> data, IReadOnlyCollection<string> propertyNames, IReadOnlyDictionary<string, ValueConverter> valueConverters = null, bool addIndexNumberColumn = false, Discriminator discriminator = null, CancellationToken cancellationToken = default)
80+
public static async Task<DataTable> ToDataTableAsync<T>(this IReadOnlyCollection<T> data, DataTableOptions options, CancellationToken cancellationToken = default)
7081
{
7182
return await Task.Run(() =>
7283
{
73-
return data.ToDataTable(propertyNames, valueConverters, addIndexNumberColumn, discriminator, cancellationToken);
84+
return data.ToDataTable(options, cancellationToken);
7485
}, cancellationToken);
7586
}
7687
}

0 commit comments

Comments
 (0)