From 30b980d7b49f602182953da39b19cac9826d280f Mon Sep 17 00:00:00 2001 From: sunkaixuna <610262374@qq.com> Date: Sat, 20 Nov 2021 22:57:20 +0800 Subject: [PATCH] db.Fastest PgSql --- Src/Asp.Net/PgSqlTest/Program.cs | 1 + .../SqlBuilder/PostgreSQLFastBuilder.cs | 72 ++++++++++++------- 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/Src/Asp.Net/PgSqlTest/Program.cs b/Src/Asp.Net/PgSqlTest/Program.cs index 9481f1940..fdc8a33cb 100644 --- a/Src/Asp.Net/PgSqlTest/Program.cs +++ b/Src/Asp.Net/PgSqlTest/Program.cs @@ -8,6 +8,7 @@ namespace OrmTest { //Demo Demo0_SqlSugarClient.Init(); + DemoO_Fastest.Init(); Demo1_Queryable.Init(); Demo2_Updateable.Init(); Demo3_Insertable.Init(); diff --git a/Src/Asp.Net/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLFastBuilder.cs b/Src/Asp.Net/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLFastBuilder.cs index ab49f6970..24567c234 100644 --- a/Src/Asp.Net/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLFastBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Realization/PostgreSQL/SqlBuilder/PostgreSQLFastBuilder.cs @@ -58,52 +58,64 @@ namespace SqlSugar return await Task.FromResult(dt.Rows.Count); } - private static void BulkCopy(DataTable dt, string copyString, NpgsqlConnection conn, List columns) + private void BulkCopy(DataTable dt, string copyString, NpgsqlConnection conn, List columns) { if (conn.State == ConnectionState.Closed) conn.Open(); + List columnViews = new List(); + foreach (DataColumn item in dt.Columns) + { + ColumnView result = new ColumnView(); + result.DbColumnInfo = columns.FirstOrDefault(it => it.DbColumnName.EqualCase(item.ColumnName)); + result.DataColumn = item; + result.EntityColumnInfo=this.entityInfo.Columns.FirstOrDefault(it => it.DbColumnName.EqualCase(item.ColumnName)); + var key = result.DbColumnInfo?.DataType?.ToLower(); + if (result.DbColumnInfo == null) + { + result.Type = null; + } + else if (PgSqlType.ContainsKey(key)) + { + result.Type = PgSqlType[key]; + } + else if (key?.First() == '_') + { + var type = PgSqlType[key.Substring(1)]; + result.Type = NpgsqlDbType.Array | type; + } + else + { + result.Type = null; + } + columnViews.Add(result); + } using (var writer = conn.BeginBinaryImport(copyString)) { foreach (DataRow row in dt.Rows) { writer.StartRow(); - foreach (DataColumn kvp in dt.Columns) + foreach (var column in columnViews) { - var first = columns.FirstOrDefault(it => it.DbColumnName.EqualCase(kvp.ColumnName)); - var key = first.DataType.ToLower(); - if (PgSqlType.ContainsKey(key)) + var value = row[column.DataColumn.ColumnName]; + if (value == null) { - WriterRow(writer, row, first); + value = DBNull.Value; } - else if (first.DataType.First() == '_') + if (column.Type == null) { - var type = PgSqlType[key.Substring(1)]; - writer.Write(row[kvp.ColumnName], NpgsqlDbType.Array | type); + writer.Write(value); } - else + else { - writer.Write(row[kvp.ColumnName]); - } + writer.Write(value, column.Type.Value); + } } } writer.Complete(); } } - private static void WriterRow(NpgsqlBinaryImporter writer, DataRow row, DbColumnInfo colInfo) - { - if (PgSqlType.ContainsKey(colInfo.DataType.ToLower())) - { - if (row[colInfo.DbColumnName] == null || row[colInfo.DbColumnName] == DBNull.Value) - { - writer.Write(DBNull.Value, NpgsqlDbType.Integer); - } - else - { - writer.Write(row[colInfo.DbColumnName], PgSqlType[colInfo.DataType.ToLower()]); - } - } - } + public override async Task UpdateByTempAsync(string tableName, string tempName, string[] updateColumns, string[] whereColumns) { var sqlquerybulder= this.Context.Queryable().SqlBuilder; @@ -119,5 +131,13 @@ namespace SqlSugar await this.Context.Queryable().Where(it => false).AS(dt.TableName).Select(" * into temp mytemptable").ToListAsync(); dt.TableName = "mytemptable"; } + + public class ColumnView + { + public DataColumn DataColumn { get; set; } + public EntityColumnInfo EntityColumnInfo { get; set; } + public DbColumnInfo DbColumnInfo { get; set; } + public NpgsqlDbType? Type { get; set; } + } } }