11using EntityFrameworkCore . SqlServer . SimpleBulks . Extensions ;
22using Microsoft . Data . SqlClient ;
3- using Microsoft . EntityFrameworkCore . Storage . ValueConversion ;
43using System ;
54using System . Collections . Generic ;
65using System . Linq . Expressions ;
@@ -11,11 +10,8 @@ namespace EntityFrameworkCore.SqlServer.SimpleBulks.TempTable;
1110
1211public class TempTableBuilder < T >
1312{
14- private IEnumerable < T > _data ;
1513 private IEnumerable < string > _columnNames ;
16- private IReadOnlyDictionary < string , string > _columnNameMappings ;
17- private IReadOnlyDictionary < string , string > _columnTypeMappings ;
18- private IReadOnlyDictionary < string , ValueConverter > _valueConverters ;
14+ private MappingContext _mappingContext ;
1915 private TempTableOptions _options ;
2016 private readonly SqlConnection _connection ;
2117 private readonly SqlTransaction _transaction ;
@@ -31,12 +27,6 @@ public TempTableBuilder(SqlConnection connection, SqlTransaction transaction)
3127 _transaction = transaction ;
3228 }
3329
34- public TempTableBuilder < T > WithData ( IEnumerable < T > data )
35- {
36- _data = data ;
37- return this ;
38- }
39-
4030 public TempTableBuilder < T > WithColumns ( IEnumerable < string > columnNames )
4131 {
4232 _columnNames = columnNames ;
@@ -49,21 +39,9 @@ public TempTableBuilder<T> WithColumns(Expression<Func<T, object>> columnNamesSe
4939 return this ;
5040 }
5141
52- public TempTableBuilder < T > WithDbColumnMappings ( IReadOnlyDictionary < string , string > columnNameMappings )
42+ public TempTableBuilder < T > WithMappingContext ( MappingContext mappingContext )
5343 {
54- _columnNameMappings = columnNameMappings ;
55- return this ;
56- }
57-
58- public TempTableBuilder < T > WithDbColumnTypeMappings ( IReadOnlyDictionary < string , string > columnTypeMappings )
59- {
60- _columnTypeMappings = columnTypeMappings ;
61- return this ;
62- }
63-
64- public TempTableBuilder < T > WithValueConverters ( IReadOnlyDictionary < string , ValueConverter > valueConverters )
65- {
66- _valueConverters = valueConverters ;
44+ _mappingContext = mappingContext ;
6745 return this ;
6846 }
6947
@@ -79,24 +57,24 @@ public TempTableBuilder<T> ConfigureTempTableOptions(Action<TempTableOptions> co
7957
8058 private string GetTableName ( )
8159 {
82- if ( ! string . IsNullOrWhiteSpace ( _options . TableName ) )
60+ if ( ! string . IsNullOrWhiteSpace ( _options ? . TableName ) )
8361 {
8462 return _options . TableName ;
8563 }
8664
87- if ( ! string . IsNullOrWhiteSpace ( _options . PrefixName ) )
65+ if ( ! string . IsNullOrWhiteSpace ( _options ? . PrefixName ) )
8866 {
8967 return _options . PrefixName + "-" + Guid . NewGuid ( ) ;
9068 }
9169
9270 return Guid . NewGuid ( ) . ToString ( ) ;
9371 }
9472
95- public string Execute ( )
73+ public string Execute ( IEnumerable < T > data )
9674 {
9775 var tempTableName = $ "[#{ GetTableName ( ) } ]";
98- var dataTable = _data . ToDataTable ( _columnNames , valueConverters : _valueConverters ) ;
99- var sqlCreateTempTable = dataTable . GenerateTableDefinition ( tempTableName , _columnNameMappings , _columnTypeMappings ) ;
76+ var dataTable = data . ToDataTable ( _columnNames , valueConverters : _mappingContext ? . ValueConverters ) ;
77+ var sqlCreateTempTable = dataTable . GenerateTableDefinition ( tempTableName , _mappingContext ? . ColumnNameMappings , _mappingContext ? . ColumnTypeMappings ) ;
10078
10179 Log ( $ "Begin creating temp table:{ Environment . NewLine } { sqlCreateTempTable } ") ;
10280
@@ -110,7 +88,7 @@ public string Execute()
11088
11189 Log ( $ "Begin executing SqlBulkCopy. TableName: { tempTableName } ") ;
11290
113- dataTable . SqlBulkCopy ( tempTableName , _columnNameMappings , _connection , _transaction ) ;
91+ dataTable . SqlBulkCopy ( tempTableName , _mappingContext ? . ColumnNameMappings , _connection , _transaction ) ;
11492
11593 Log ( "End executing SqlBulkCopy." ) ;
11694
@@ -122,15 +100,15 @@ private void Log(string message)
122100 _options ? . LogTo ? . Invoke ( $ "{ DateTimeOffset . Now : yyyy-MM-dd HH:mm:ss.fff zzz} [TempTable]: { message } ") ;
123101 }
124102
125- public async Task < string > ExecuteAsync ( CancellationToken cancellationToken = default )
103+ public async Task < string > ExecuteAsync ( IEnumerable < T > data , CancellationToken cancellationToken = default )
126104 {
127105 var tempTableName = $ "[#{ GetTableName ( ) } ]";
128- var dataTable = await _data . ToDataTableAsync ( _columnNames , valueConverters : _valueConverters , cancellationToken : cancellationToken ) ;
129- var sqlCreateTempTable = dataTable . GenerateTableDefinition ( tempTableName , _columnNameMappings , _columnTypeMappings ) ;
106+ var dataTable = await data . ToDataTableAsync ( _columnNames , valueConverters : _mappingContext ? . ValueConverters , cancellationToken : cancellationToken ) ;
107+ var sqlCreateTempTable = dataTable . GenerateTableDefinition ( tempTableName , _mappingContext ? . ColumnNameMappings , _mappingContext ? . ColumnTypeMappings ) ;
130108
131109 Log ( $ "Begin creating temp table:{ Environment . NewLine } { sqlCreateTempTable } ") ;
132110
133- _connection . EnsureOpen ( ) ;
111+ await _connection . EnsureOpenAsync ( cancellationToken ) ;
134112 using ( var createTempTableCommand = _connection . CreateTextCommand ( _transaction , sqlCreateTempTable ) )
135113 {
136114 await createTempTableCommand . ExecuteNonQueryAsync ( cancellationToken ) ;
@@ -140,7 +118,7 @@ public async Task<string> ExecuteAsync(CancellationToken cancellationToken = def
140118
141119 Log ( $ "Begin executing SqlBulkCopy. TableName: { tempTableName } ") ;
142120
143- await dataTable . SqlBulkCopyAsync ( tempTableName , _columnNameMappings , _connection , _transaction , cancellationToken : cancellationToken ) ;
121+ await dataTable . SqlBulkCopyAsync ( tempTableName , _mappingContext ? . ColumnNameMappings , _connection , _transaction , cancellationToken : cancellationToken ) ;
144122
145123 Log ( "End executing SqlBulkCopy." ) ;
146124
0 commit comments