Skip to content

Commit 2364dd0

Browse files
author
fabien.menager
committed
Add SQL dialect mappings and enhance SQL expression handling for bulk insert operations
1 parent e19ce06 commit 2364dd0

18 files changed

Lines changed: 178 additions & 66 deletions

File tree

.idea/.idea.EntityFrameworkCore.ExecuteInsert/.idea/sqldialects.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

EntityFrameworkCore.ExecuteInsert.sln

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ EndProject
77
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EntityFrameworkCore.ExecuteInsert.SqlServer", "src\EntityFrameworkCore.ExecuteInsert.SqlServer\EntityFrameworkCore.ExecuteInsert.SqlServer.csproj", "{8098F37B-FA5E-4BDB-B64A-00FBDE2001C9}"
88
EndProject
99
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{CBEBA2A8-79E0-412E-93C1-C88F4473D78B}"
10+
ProjectSection(SolutionItems) = preProject
11+
src\Directory.Build.props = src\Directory.Build.props
12+
EndProjectSection
1013
EndProject
1114
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{F8A83782-311C-454D-8B97-B3FB86478BF4}"
1215
EndProject

src/Directory.Build.props

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,8 @@
77
<Nullable>enable</Nullable>
88
</PropertyGroup>
99

10+
<ItemGroup>
11+
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
12+
</ItemGroup>
13+
1014
</Project>

src/EntityFrameworkCore.ExecuteInsert.PostgreSql/EntityFrameworkCore.ExecuteInsert.PostgreSql.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
</ItemGroup>
66

77
<ItemGroup>
8-
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
98
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.11" />
109
</ItemGroup>
1110

src/EntityFrameworkCore.ExecuteInsert.PostgreSql/PostgreSqlBulkInsertProvider.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
using EntityFrameworkCore.ExecuteInsert.Options;
22

3+
using JetBrains.Annotations;
4+
35
using Microsoft.EntityFrameworkCore;
46

57
using Npgsql;
68

79
namespace EntityFrameworkCore.ExecuteInsert.PostgreSql;
810

11+
[UsedImplicitly]
912
public class PostgreSqlBulkInsertProvider : BulkInsertProviderBase<PostgreSqlDialectBuilder>
1013
{
1114
//language=sql

src/EntityFrameworkCore.ExecuteInsert.SqlServer/EntityFrameworkCore.ExecuteInsert.SqlServer.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
</ItemGroup>
66

77
<ItemGroup>
8-
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
98
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.15" />
109
</ItemGroup>
1110

src/EntityFrameworkCore.ExecuteInsert.SqlServer/SqlServerBulkInsertProvider.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
using EntityFrameworkCore.ExecuteInsert.Options;
22

3+
using JetBrains.Annotations;
4+
35
using Microsoft.Data.SqlClient;
46
using Microsoft.EntityFrameworkCore;
57

68
namespace EntityFrameworkCore.ExecuteInsert.SqlServer;
79

10+
[UsedImplicitly]
811
public class SqlServerBulkInsertProvider : BulkInsertProviderBase<SqlServerDialectBuilder>
912
{
1013
//language=sql
@@ -30,7 +33,7 @@ protected override async Task BulkInsert<T>(DbContext context, IEnumerable<T> en
3033

3134
foreach (var prop in properties)
3235
{
33-
bulkCopy.ColumnMappings.Add(prop.Name, SqlDialect.Escape(prop.Name));
36+
bulkCopy.ColumnMappings.Add(prop.Name, SqlDialect.Escape(prop.ColumnName));
3437
}
3538

3639
await bulkCopy.WriteToServerAsync(new EnumerableDataReader<T>(entities, properties), ctk);

src/EntityFrameworkCore.ExecuteInsert.SqlServer/SqlServerDialectBuilder.cs

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@ public class SqlServerDialectBuilder : SqlDialectBuilder
1313
{
1414
protected override string OpenDelimiter => "[";
1515
protected override string CloseDelimiter => "]";
16+
protected override string ConcatOperator => "+";
17+
18+
protected override bool SupportsMoveRows => false;
1619

17-
public override string BuildMoveDataSql<T>(string source,
20+
public override string BuildMoveDataSql<T>(DbContext context, string source,
1821
string target,
1922
IProperty[] insertedProperties,
2023
IProperty[] properties,
@@ -23,30 +26,20 @@ public override string BuildMoveDataSql<T>(string source,
2326
var insertedColumns = insertedProperties.Select(p => Escape(p.GetColumnName())).ToArray();
2427
var insertedColumnList = string.Join(", ", insertedColumns);
2528

26-
var returnedColumns = properties.Select(p => $"INSERTED.{p.GetColumnName()} AS [{p.Name}]");
29+
var returnedColumns = properties.Select(p => $"INSERTED.{p.GetColumnName()} AS {p.GetColumnName()}");
2730
var columnList = string.Join(", ", returnedColumns);
2831

2932
var q = new StringBuilder();
3033

31-
// if (options.MoveRows)
32-
// {
33-
// var deletedColumnList = string.Join(", ", insertedColumns.Select(c => $"DELETED.{c}"));
34-
//
35-
// q.AppendLine($"""
36-
// DELETE FROM {tableName}
37-
// OUTPUT {deletedColumnList}
38-
// """);
39-
// }
40-
4134
// Merge handling
4235
if (onConflict is OnConflictOptions<T> onConflictTyped && onConflictTyped.Match != null)
4336
{
44-
var matchColumns = GetColumns(onConflictTyped.Match);
37+
var matchColumns = GetColumns(context, onConflictTyped.Match);
4538
var matchOn = string.Join(" AND ",
46-
matchColumns.Select(col => $"TARGET.{Escape(col)} = SOURCE.{Escape(col)}"));
39+
matchColumns.Select(col => $"TARGET.{col} = SOURCE.{col}"));
4740

4841
var updateSet = onConflictTyped.Update != null
49-
? string.Join(", ", GetUpdates(onConflictTyped.Update))
42+
? string.Join(", ", GetUpdates(context, onConflictTyped.Update))
5043
: null;
5144

5245
q.AppendLine($"MERGE INTO {target} AS TARGET");
@@ -89,11 +82,8 @@ public override string BuildMoveDataSql<T>(string source,
8982
return q.ToString();
9083
}
9184

92-
protected override string GetExcludedColumnName(MemberExpression member)
85+
protected override string GetExcludedColumnName<TEntity>(DbContext context, MemberExpression member)
9386
{
94-
var prefix = "SOURCE";
95-
return $"{prefix}.{Escape(member.Member.Name)}";
87+
return $"SOURCE.{GetColumnName<TEntity>(context, member.Member.Name)}";
9688
}
97-
98-
protected override string ConcatOperator => "+";
9989
}

src/EntityFrameworkCore.ExecuteInsert.Sqlite/EntityFrameworkCore.ExecuteInsert.Sqlite.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
<ItemGroup>
88
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.11" />
9-
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
109
</ItemGroup>
1110

1211
</Project>

src/EntityFrameworkCore.ExecuteInsert.Sqlite/SqliteBulkInsertProvider.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33
using EntityFrameworkCore.ExecuteInsert.Extensions;
44
using EntityFrameworkCore.ExecuteInsert.Options;
55

6+
using JetBrains.Annotations;
7+
68
using Microsoft.EntityFrameworkCore;
79
using Microsoft.Data.Sqlite;
810

911
namespace EntityFrameworkCore.ExecuteInsert.Sqlite;
1012

13+
[UsedImplicitly]
1114
public class SqliteBulkInsertProvider : BulkInsertProviderBase<SqliteDialectBuilder>
1215
{
1316
protected override string BulkInsertId => "rowid";

0 commit comments

Comments
 (0)