diff --git a/Src/Asp.Net/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs b/Src/Asp.Net/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs index db1051bc7..4b7165e10 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/EntityMaintenance/EntityMaintenance.cs @@ -152,6 +152,7 @@ namespace SqlSugar column.EntityName = result.EntityName; column.PropertyName = property.Name; column.PropertyInfo = property; + column.UnderType = UtilMethods.GetUnderType(column.PropertyInfo.PropertyType); if (sugarColumn.IsNullOrEmpty()) { column.DbColumnName = property.Name; diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs index 0f7e0e68a..17199dc73 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/FastestProvider.cs @@ -6,11 +6,12 @@ using System.Threading.Tasks; using System.Linq; namespace SqlSugar { - public class FastestProvider:IFastest where T:class,new() + public partial class FastestProvider:IFastest where T:class,new() { private SqlSugarProvider context; private ISugarQueryable queryable; private string AsName { get; set; } + private int Size { get; set; } private EntityInfo entityInfo { get; set; } public FastestProvider(SqlSugarProvider sqlSugarProvider) { @@ -26,11 +27,19 @@ namespace SqlSugar } public async Task BulkCopyAsync(List datas) { - DataTable dt = ToDdateTable(datas); - IFastBuilder buider = new SqlServerFastBuilder(); - buider.Context = context; - var result = await buider.ExecuteBulkCopyAsync(dt); - return result; + if (Size > 0) + { + int resul=0; + await this.context.Utilities.PageEachAsync(datas, Size, async item => + { + resul+= await _BulkCopy(item); + }); + return resul; + } + else + { + return await _BulkCopy(datas); + } } #endregion @@ -50,6 +59,26 @@ namespace SqlSugar return BulkUpdateAsync(datas,whereColumns,updateColumns).ConfigureAwait(true).GetAwaiter().GetResult(); } public async Task BulkUpdateAsync(List datas,string [] whereColumns,string [] updateColumns) + { + + if (Size > 0) + { + int resul = 0; + await this.context.Utilities.PageEachAsync(datas, Size, async item => + { + resul += await _BulkUpdate(item, whereColumns, updateColumns); + }); + return resul; + } + else + { + return await _BulkUpdate(datas, whereColumns, updateColumns); + } + } + #endregion + + #region Core + private async Task _BulkUpdate(List datas, string[] whereColumns, string[] updateColumns) { var isAuto = this.context.CurrentConnectionConfig.IsAutoCloseConnection; this.context.CurrentConnectionConfig.IsAutoCloseConnection = false; @@ -64,107 +93,15 @@ namespace SqlSugar this.context.CurrentConnectionConfig.IsAutoCloseConnection = isAuto; return result; } - #endregion - - #region Setting - public IFastest AS(string tableName) + private async Task _BulkCopy(List datas) { - this.AsName = tableName; - return this; + DataTable dt = ToDdateTable(datas); + IFastBuilder buider = new SqlServerFastBuilder(); + buider.Context = context; + var result = await buider.ExecuteBulkCopyAsync(dt); + return result; } #endregion - #region Helper - private SqlServerFastBuilder GetBuider() - { - switch (this.context.CurrentConnectionConfig.DbType) - { - case DbType.MySql: - break; - case DbType.SqlServer: - return new SqlServerFastBuilder(); - case DbType.Sqlite: - break; - case DbType.Oracle: - break; - case DbType.PostgreSQL: - break; - case DbType.Dm: - break; - case DbType.Kdbndp: - break; - case DbType.Oscar: - break; - default: - break; - } - throw new Exception(this.context.CurrentConnectionConfig.DbType + "开发中"); - } - private DataTable ToDdateTable(List datas) - { - DataTable tempDataTable = ReflectionInoCore.GetInstance().GetOrCreate("BulkCopyAsync" + typeof(T).FullName, - () => - { - if (AsName == null) - { - return queryable.Where(it => false).ToDataTable(); - } - else - { - return queryable.AS(AsName).Where(it => false).ToDataTable(); - } - } - ); - var dt = new DataTable(); - foreach (DataColumn item in tempDataTable.Columns) - { - dt.Columns.Add(item.ColumnName, item.DataType); - } - dt.TableName = GetTableName(); - var columns = entityInfo.Columns; - foreach (var item in datas) - { - var dr = dt.NewRow(); - foreach (var column in columns) - { - if (column.IsIgnore || column.IsOnlyIgnoreInsert) - { - continue; - } - var name = column.DbColumnName; - if (name == null) - { - name = column.PropertyName; - } - var value = ValueConverter(column, PropertyCallAdapterProvider.GetInstance(column.PropertyName).InvokeGet(item)); - dr[name] = value; - } - dt.Rows.Add(dr); - } - - return dt; - } - private string GetTableName() - { - if (this.AsName.HasValue()) - { - return queryable.SqlBuilder.GetTranslationTableName(AsName); - } - else - { - return queryable.SqlBuilder.GetTranslationTableName(entityInfo.DbTableName); - } - } - private object ValueConverter(EntityColumnInfo columnInfo, object value) - { - if (value == null) - return value; - if (value is DateTime && (DateTime)value == DateTime.MinValue) - { - value = Convert.ToDateTime("1900-01-01"); - } - return value; - } - #endregion } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/_Private.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/_Private.cs new file mode 100644 index 000000000..289bde247 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/_Private.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public partial class FastestProvider : IFastest where T : class, new() + { + private SqlServerFastBuilder GetBuider() + { + switch (this.context.CurrentConnectionConfig.DbType) + { + case DbType.MySql: + break; + case DbType.SqlServer: + return new SqlServerFastBuilder(); + case DbType.Sqlite: + break; + case DbType.Oracle: + break; + case DbType.PostgreSQL: + break; + case DbType.Dm: + break; + case DbType.Kdbndp: + break; + case DbType.Oscar: + break; + default: + break; + } + throw new Exception(this.context.CurrentConnectionConfig.DbType + "开发中"); + } + private DataTable ToDdateTable(List datas) + { + DataTable tempDataTable = ReflectionInoCore.GetInstance().GetOrCreate("BulkCopyAsync" + typeof(T).FullName, + () => + { + if (AsName == null) + { + return queryable.Where(it => false).ToDataTable(); + } + else + { + return queryable.AS(AsName).Where(it => false).ToDataTable(); + } + } + ); + var dt = new DataTable(); + foreach (DataColumn item in tempDataTable.Columns) + { + dt.Columns.Add(item.ColumnName, item.DataType); + } + dt.TableName = GetTableName(); + var columns = entityInfo.Columns; + foreach (var item in datas) + { + var dr = dt.NewRow(); + foreach (var column in columns) + { + if (column.IsIgnore || column.IsOnlyIgnoreInsert) + { + continue; + } + var name = column.DbColumnName; + if (name == null) + { + name = column.PropertyName; + } + var value = ValueConverter(column, PropertyCallAdapterProvider.GetInstance(column.PropertyName).InvokeGet(item)); + dr[name] = value; + } + dt.Rows.Add(dr); + } + + return dt; + } + private string GetTableName() + { + if (this.AsName.HasValue()) + { + return queryable.SqlBuilder.GetTranslationTableName(AsName); + } + else + { + return queryable.SqlBuilder.GetTranslationTableName(entityInfo.DbTableName); + } + } + private object ValueConverter(EntityColumnInfo columnInfo, object value) + { + if (value == null) + return value; + if (value is DateTime && (DateTime)value == DateTime.MinValue) + { + value = Convert.ToDateTime("1900-01-01"); + } + return value; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/_Setting.cs b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/_Setting.cs new file mode 100644 index 000000000..4f14242d0 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/FastestProvider/_Setting.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public partial class FastestProvider : IFastest where T : class, new() + { + public IFastest AS(string tableName) + { + this.AsName = tableName; + return this; + } + public IFastest PageSize(int size) + { + this.Size = size; + return this; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Entities/EntityColumnInfo.cs b/Src/Asp.Net/SqlSugar/Entities/EntityColumnInfo.cs index 2ef141f4b..6918f5dc7 100644 --- a/Src/Asp.Net/SqlSugar/Entities/EntityColumnInfo.cs +++ b/Src/Asp.Net/SqlSugar/Entities/EntityColumnInfo.cs @@ -35,5 +35,6 @@ namespace SqlSugar public string[] IndexGroupNameList { get; set; } public string[] UIndexGroupNameList { get; set; } public bool IsArray { get; set; } + public Type UnderType { get; set; } } } diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 2ddfb472d..578ada074 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -89,6 +89,8 @@ + +