Skip to content

Commit 52e7357

Browse files
committed
Upsert
1 parent 63c1bf4 commit 52e7357

File tree

4 files changed

+304
-0
lines changed

4 files changed

+304
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkMerge;
2+
using EntityFrameworkCore.SqlServer.SimpleBulks.Extensions;
3+
using Microsoft.EntityFrameworkCore;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq.Expressions;
7+
using System.Threading;
8+
using System.Threading.Tasks;
9+
10+
namespace EntityFrameworkCore.SqlServer.SimpleBulks.Upsert;
11+
12+
public static class DbContextAsyncExtensions
13+
{
14+
public static Task<BulkMergeResult> UpsertAsync<T>(this DbContext dbContext, T data, Expression<Func<T, object>> idSelector, Expression<Func<T, object>> updateColumnNamesSelector, Expression<Func<T, object>> insertColumnNamesSelector, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
15+
{
16+
var connection = dbContext.GetSqlConnection();
17+
var transaction = dbContext.GetCurrentSqlTransaction();
18+
var outputIdColumn = dbContext.GetOutputId(typeof(T))?.PropertyName;
19+
20+
return new BulkMergeBuilder<T>(connection, transaction)
21+
.WithId(idSelector)
22+
.WithUpdateColumns(updateColumnNamesSelector)
23+
.WithInsertColumns(insertColumnNamesSelector)
24+
.WithDbColumnMappings(dbContext.GetColumnNames(typeof(T)))
25+
.WithDbColumnTypeMappings(dbContext.GetColumnTypes(typeof(T)))
26+
.WithOutputId(outputIdColumn)
27+
.WithValueConverters(dbContext.GetValueConverters(typeof(T)))
28+
.ToTable(dbContext.GetTableInfor(typeof(T)))
29+
.ConfigureBulkOptions(configureOptions)
30+
.SingleMergeAsync(data, cancellationToken);
31+
}
32+
33+
public static Task<BulkMergeResult> UpsertAsync<T>(this DbContext dbContext, T data, string idColumn, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
34+
{
35+
var connection = dbContext.GetSqlConnection();
36+
var transaction = dbContext.GetCurrentSqlTransaction();
37+
var outputIdColumn = dbContext.GetOutputId(typeof(T))?.PropertyName;
38+
39+
return new BulkMergeBuilder<T>(connection, transaction)
40+
.WithId(idColumn)
41+
.WithUpdateColumns(updateColumnNames)
42+
.WithInsertColumns(insertColumnNames)
43+
.WithDbColumnMappings(dbContext.GetColumnNames(typeof(T)))
44+
.WithDbColumnTypeMappings(dbContext.GetColumnTypes(typeof(T)))
45+
.WithOutputId(outputIdColumn)
46+
.WithValueConverters(dbContext.GetValueConverters(typeof(T)))
47+
.ToTable(dbContext.GetTableInfor(typeof(T)))
48+
.ConfigureBulkOptions(configureOptions)
49+
.SingleMergeAsync(data, cancellationToken);
50+
}
51+
52+
public static Task<BulkMergeResult> UpsertAsync<T>(this DbContext dbContext, T data, IEnumerable<string> idColumns, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
53+
{
54+
var connection = dbContext.GetSqlConnection();
55+
var transaction = dbContext.GetCurrentSqlTransaction();
56+
var outputIdColumn = dbContext.GetOutputId(typeof(T))?.PropertyName;
57+
58+
return new BulkMergeBuilder<T>(connection, transaction)
59+
.WithId(idColumns)
60+
.WithUpdateColumns(updateColumnNames)
61+
.WithInsertColumns(insertColumnNames)
62+
.WithDbColumnMappings(dbContext.GetColumnNames(typeof(T)))
63+
.WithDbColumnTypeMappings(dbContext.GetColumnTypes(typeof(T)))
64+
.WithOutputId(outputIdColumn)
65+
.WithValueConverters(dbContext.GetValueConverters(typeof(T)))
66+
.ToTable(dbContext.GetTableInfor(typeof(T)))
67+
.ConfigureBulkOptions(configureOptions)
68+
.SingleMergeAsync(data, cancellationToken);
69+
}
70+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkMerge;
2+
using EntityFrameworkCore.SqlServer.SimpleBulks.Extensions;
3+
using Microsoft.EntityFrameworkCore;
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq.Expressions;
7+
8+
namespace EntityFrameworkCore.SqlServer.SimpleBulks.Upsert;
9+
10+
public static class DbContextExtensions
11+
{
12+
public static BulkMergeResult Upsert<T>(this DbContext dbContext, T data, Expression<Func<T, object>> idSelector, Expression<Func<T, object>> updateColumnNamesSelector, Expression<Func<T, object>> insertColumnNamesSelector, Action<BulkMergeOptions> configureOptions = null)
13+
{
14+
var connection = dbContext.GetSqlConnection();
15+
var transaction = dbContext.GetCurrentSqlTransaction();
16+
var outputIdColumn = dbContext.GetOutputId(typeof(T))?.PropertyName;
17+
18+
return new BulkMergeBuilder<T>(connection, transaction)
19+
.WithId(idSelector)
20+
.WithUpdateColumns(updateColumnNamesSelector)
21+
.WithInsertColumns(insertColumnNamesSelector)
22+
.WithDbColumnMappings(dbContext.GetColumnNames(typeof(T)))
23+
.WithDbColumnTypeMappings(dbContext.GetColumnTypes(typeof(T)))
24+
.WithOutputId(outputIdColumn)
25+
.WithValueConverters(dbContext.GetValueConverters(typeof(T)))
26+
.ToTable(dbContext.GetTableInfor(typeof(T)))
27+
.ConfigureBulkOptions(configureOptions)
28+
.SingleMerge(data);
29+
}
30+
31+
public static BulkMergeResult Upsert<T>(this DbContext dbContext, T data, string idColumn, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null)
32+
{
33+
var connection = dbContext.GetSqlConnection();
34+
var transaction = dbContext.GetCurrentSqlTransaction();
35+
var outputIdColumn = dbContext.GetOutputId(typeof(T))?.PropertyName;
36+
37+
return new BulkMergeBuilder<T>(connection, transaction)
38+
.WithId(idColumn)
39+
.WithUpdateColumns(updateColumnNames)
40+
.WithInsertColumns(insertColumnNames)
41+
.WithDbColumnMappings(dbContext.GetColumnNames(typeof(T)))
42+
.WithDbColumnTypeMappings(dbContext.GetColumnTypes(typeof(T)))
43+
.WithOutputId(outputIdColumn)
44+
.WithValueConverters(dbContext.GetValueConverters(typeof(T)))
45+
.ToTable(dbContext.GetTableInfor(typeof(T)))
46+
.ConfigureBulkOptions(configureOptions)
47+
.SingleMerge(data);
48+
}
49+
50+
public static BulkMergeResult Upsert<T>(this DbContext dbContext, T data, IEnumerable<string> idColumns, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null)
51+
{
52+
var connection = dbContext.GetSqlConnection();
53+
var transaction = dbContext.GetCurrentSqlTransaction();
54+
var outputIdColumn = dbContext.GetOutputId(typeof(T))?.PropertyName;
55+
56+
return new BulkMergeBuilder<T>(connection, transaction)
57+
.WithId(idColumns)
58+
.WithUpdateColumns(updateColumnNames)
59+
.WithInsertColumns(insertColumnNames)
60+
.WithDbColumnMappings(dbContext.GetColumnNames(typeof(T)))
61+
.WithDbColumnTypeMappings(dbContext.GetColumnTypes(typeof(T)))
62+
.WithOutputId(outputIdColumn)
63+
.WithValueConverters(dbContext.GetValueConverters(typeof(T)))
64+
.ToTable(dbContext.GetTableInfor(typeof(T)))
65+
.ConfigureBulkOptions(configureOptions)
66+
.SingleMerge(data);
67+
}
68+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkMerge;
2+
using Microsoft.Data.SqlClient;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq.Expressions;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
9+
namespace EntityFrameworkCore.SqlServer.SimpleBulks.Upsert;
10+
11+
public static class SqlConnectionAsyncExtensions
12+
{
13+
public static Task<BulkMergeResult> UpsertAsync<T>(this SqlConnection connection, T data, Expression<Func<T, object>> idSelector, Expression<Func<T, object>> updateColumnNamesSelector, Expression<Func<T, object>> insertColumnNamesSelector, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
14+
{
15+
var table = TableMapper.Resolve(typeof(T));
16+
17+
return new BulkMergeBuilder<T>(connection)
18+
.WithId(idSelector)
19+
.WithUpdateColumns(updateColumnNamesSelector)
20+
.WithInsertColumns(insertColumnNamesSelector)
21+
.ToTable(table)
22+
.ConfigureBulkOptions(configureOptions)
23+
.SingleMergeAsync(data, cancellationToken);
24+
}
25+
26+
public static Task<BulkMergeResult> UpsertAsync<T>(this SqlConnection connection, T data, string idColumn, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
27+
{
28+
var table = TableMapper.Resolve(typeof(T));
29+
30+
return new BulkMergeBuilder<T>(connection)
31+
.WithId(idColumn)
32+
.WithUpdateColumns(updateColumnNames)
33+
.WithInsertColumns(insertColumnNames)
34+
.ToTable(table)
35+
.ConfigureBulkOptions(configureOptions)
36+
.SingleMergeAsync(data, cancellationToken);
37+
}
38+
39+
public static Task<BulkMergeResult> UpsertAsync<T>(this SqlConnection connection, T data, IEnumerable<string> idColumns, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
40+
{
41+
var table = TableMapper.Resolve(typeof(T));
42+
43+
return new BulkMergeBuilder<T>(connection)
44+
.WithId(idColumns)
45+
.WithUpdateColumns(updateColumnNames)
46+
.WithInsertColumns(insertColumnNames)
47+
.ToTable(table)
48+
.ConfigureBulkOptions(configureOptions)
49+
.SingleMergeAsync(data, cancellationToken);
50+
}
51+
52+
public static Task<BulkMergeResult> UpsertAsync<T>(this SqlConnection connection, T data, TableInfor table, Expression<Func<T, object>> idSelector, Expression<Func<T, object>> updateColumnNamesSelector, Expression<Func<T, object>> insertColumnNamesSelector, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
53+
{
54+
return new BulkMergeBuilder<T>(connection)
55+
.WithId(idSelector)
56+
.WithUpdateColumns(updateColumnNamesSelector)
57+
.WithInsertColumns(insertColumnNamesSelector)
58+
.ToTable(table)
59+
.ConfigureBulkOptions(configureOptions)
60+
.SingleMergeAsync(data, cancellationToken);
61+
}
62+
63+
public static Task<BulkMergeResult> UpsertAsync<T>(this SqlConnection connection, T data, TableInfor table, string idColumn, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
64+
{
65+
return new BulkMergeBuilder<T>(connection)
66+
.WithId(idColumn)
67+
.WithUpdateColumns(updateColumnNames)
68+
.WithInsertColumns(insertColumnNames)
69+
.ToTable(table)
70+
.ConfigureBulkOptions(configureOptions)
71+
.SingleMergeAsync(data, cancellationToken);
72+
}
73+
74+
public static Task<BulkMergeResult> UpsertAsync<T>(this SqlConnection connection, T data, TableInfor table, IEnumerable<string> idColumns, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null, CancellationToken cancellationToken = default)
75+
{
76+
return new BulkMergeBuilder<T>(connection)
77+
.WithId(idColumns)
78+
.WithUpdateColumns(updateColumnNames)
79+
.WithInsertColumns(insertColumnNames)
80+
.ToTable(table)
81+
.ConfigureBulkOptions(configureOptions)
82+
.SingleMergeAsync(data, cancellationToken);
83+
}
84+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkMerge;
2+
using Microsoft.Data.SqlClient;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq.Expressions;
6+
7+
namespace EntityFrameworkCore.SqlServer.SimpleBulks.Upsert;
8+
9+
public static class SqlConnectionExtensions
10+
{
11+
public static BulkMergeResult Upsert<T>(this SqlConnection connection, T data, Expression<Func<T, object>> idSelector, Expression<Func<T, object>> updateColumnNamesSelector, Expression<Func<T, object>> insertColumnNamesSelector, Action<BulkMergeOptions> configureOptions = null)
12+
{
13+
var table = TableMapper.Resolve(typeof(T));
14+
15+
return new BulkMergeBuilder<T>(connection)
16+
.WithId(idSelector)
17+
.WithUpdateColumns(updateColumnNamesSelector)
18+
.WithInsertColumns(insertColumnNamesSelector)
19+
.ToTable(table)
20+
.ConfigureBulkOptions(configureOptions)
21+
.SingleMerge(data);
22+
}
23+
24+
public static BulkMergeResult Upsert<T>(this SqlConnection connection, T data, string idColumn, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null)
25+
{
26+
var table = TableMapper.Resolve(typeof(T));
27+
28+
return new BulkMergeBuilder<T>(connection)
29+
.WithId(idColumn)
30+
.WithUpdateColumns(updateColumnNames)
31+
.WithInsertColumns(insertColumnNames)
32+
.ToTable(table)
33+
.ConfigureBulkOptions(configureOptions)
34+
.SingleMerge(data);
35+
}
36+
37+
public static BulkMergeResult Upsert<T>(this SqlConnection connection, T data, IEnumerable<string> idColumns, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null)
38+
{
39+
var table = TableMapper.Resolve(typeof(T));
40+
41+
return new BulkMergeBuilder<T>(connection)
42+
.WithId(idColumns)
43+
.WithUpdateColumns(updateColumnNames)
44+
.WithInsertColumns(insertColumnNames)
45+
.ToTable(table)
46+
.ConfigureBulkOptions(configureOptions)
47+
.SingleMerge(data);
48+
}
49+
50+
public static BulkMergeResult Upsert<T>(this SqlConnection connection, T data, TableInfor table, Expression<Func<T, object>> idSelector, Expression<Func<T, object>> updateColumnNamesSelector, Expression<Func<T, object>> insertColumnNamesSelector, Action<BulkMergeOptions> configureOptions = null)
51+
{
52+
return new BulkMergeBuilder<T>(connection)
53+
.WithId(idSelector)
54+
.WithUpdateColumns(updateColumnNamesSelector)
55+
.WithInsertColumns(insertColumnNamesSelector)
56+
.ToTable(table)
57+
.ConfigureBulkOptions(configureOptions)
58+
.SingleMerge(data);
59+
}
60+
61+
public static BulkMergeResult Upsert<T>(this SqlConnection connection, T data, TableInfor table, string idColumn, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null)
62+
{
63+
return new BulkMergeBuilder<T>(connection)
64+
.WithId(idColumn)
65+
.WithUpdateColumns(updateColumnNames)
66+
.WithInsertColumns(insertColumnNames)
67+
.ToTable(table)
68+
.ConfigureBulkOptions(configureOptions)
69+
.SingleMerge(data);
70+
}
71+
72+
public static BulkMergeResult Upsert<T>(this SqlConnection connection, T data, TableInfor table, IEnumerable<string> idColumns, IEnumerable<string> updateColumnNames, IEnumerable<string> insertColumnNames, Action<BulkMergeOptions> configureOptions = null)
73+
{
74+
return new BulkMergeBuilder<T>(connection)
75+
.WithId(idColumns)
76+
.WithUpdateColumns(updateColumnNames)
77+
.WithInsertColumns(insertColumnNames)
78+
.ToTable(table)
79+
.ConfigureBulkOptions(configureOptions)
80+
.SingleMerge(data);
81+
}
82+
}

0 commit comments

Comments
 (0)