From 642955a948a88feee66aa5f7e767bfceda0184ff Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sat, 30 Apr 2022 19:03:10 +0800 Subject: [PATCH] Update Core --- .../IDataReaderEntityBuilder.cs | 6 +- .../DeleteProvider/DeleteableProvider.cs | 35 +++- .../FastestProvider/FastestProvider.cs | 16 ++ .../QueryableProvider/MappingFieldsHelper.cs | 180 ++++++++++++++++++ .../QueryableProvider/NavigatManager.cs | 108 ++++++++++- .../QueryableProvider/QueryableProvider.cs | 50 ++++- .../Abstract/SaveableProvider/Storageable.cs | 8 +- Src/Asp.NetCore2/SqlSugar/Enum/NavigatType.cs | 3 +- .../ExpressionsToSql/Common/ExpressionTool.cs | 45 +++++ .../MemberInitExpressionResolve.cs | 44 +++-- .../SqlSugar/Infrastructure/ContextMethods.cs | 24 +++ .../SqlSugar/Interface/IContextMethods.cs | 1 + .../SqlSugar/Interface/IDeleteable.cs | 3 +- .../SqlSugar/Interface/IFastest.cs | 3 + .../SqlSugar/Interface/IQueryable.cs | 3 +- .../SqlSugar/Interface/ISimpleClient.cs | 2 + .../Realization/Oracle/OracleProvider.cs | 4 + .../Oracle/SqlBuilder/OracleInsertBuilder.cs | 8 +- .../Oracle/SqlBuilder/OracleUpdateBuilder.cs | 2 +- Src/Asp.NetCore2/SqlSugar/SimpleClient.cs | 8 + Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs | 6 + .../SqlSugar/Utilities/CommonExtensions.cs | 4 + 22 files changed, 521 insertions(+), 42 deletions(-) create mode 100644 Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/MappingFieldsHelper.cs diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index 609cc8013..74e15db99 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -229,7 +229,11 @@ namespace SqlSugar { method = isNullableType ? getConvertByte : getByte; } - else if (bindPropertyType == UtilConstants.StringType&&dbTypeName?.ToLower()== "timestamp") + else if (bindPropertyType == UtilConstants.StringType && dbTypeName?.ToLower() == "timestamp") + { + method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType); + } + else if (dbTypeName.EqualCase("STRING")) { method = isNullableType ? getOtherNull.MakeGenericMethod(bindPropertyType) : getOther.MakeGenericMethod(bindPropertyType); } diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index a72d970f2..40547d9aa 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -254,15 +254,44 @@ namespace SqlSugar return result; } - public IDeleteable WhereColumns(Expression> columns) + public IDeleteable WhereColumns(List list,Expression> columns) { - if (columns != null) + if (this.GetPrimaryKeys().IsNullOrEmpty()) + { + tempPrimaryKeys = DeleteBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it)).ToList(); + } + this.Where(list); + if (columns != null&& tempPrimaryKeys.IsNullOrEmpty()) { tempPrimaryKeys = DeleteBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it)).ToList(); } return this; } - + public IDeleteable WhereColumns(List> list) + { + List conditionalModels = new List(); + foreach (var model in list) + { + int i = 0; + var clist = new List>(); + foreach (var item in model.Keys) + { + clist.Add(new KeyValuePair(i == 0 ? WhereType.Or : WhereType.And, new ConditionalModel() + { + FieldName =item, + ConditionalType = ConditionalType.Equal, + FieldValue = model[item].ObjToString(), + CSharpTypeName = model[item]==null?null : model[item].GetType().Name + })); + i++; + } + conditionalModels.Add(new ConditionalCollections() + { + ConditionalList = clist + }); + } + return this.Where(conditionalModels); + } public IDeleteable RemoveDataCache() { this.RemoveCacheFunc = () => diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/FastestProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/FastestProvider.cs index 03c7d5515..e5a82bf33 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/FastestProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/FastestProvider/FastestProvider.cs @@ -24,6 +24,11 @@ namespace SqlSugar { return BulkCopyAsync(tableName,dt).ConfigureAwait(true).GetAwaiter().GetResult(); } + public int BulkCopy(DataTable dt) + { + Check.ExceptionEasy(this.AsName.IsNullOrEmpty(), "need .AS(tablaeName) ", "需要 .AS(tablaeName) 设置表名"); + return BulkCopyAsync(this.AsName, dt).ConfigureAwait(true).GetAwaiter().GetResult(); + } public async Task BulkCopyAsync(string tableName, DataTable dt) { if (Size > 0) @@ -99,6 +104,17 @@ namespace SqlSugar { return BulkUpdateAsync(tableName,dataTable, whereColumns, updateColumns).ConfigureAwait(true).GetAwaiter().GetResult(); } + public int BulkUpdate(DataTable dataTable, string[] whereColumns, string[] updateColumns) + { + Check.ExceptionEasy(this.AsName.IsNullOrEmpty(), "need .AS(tablaeName) ", "需要 .AS(tablaeName) 设置表名"); + return BulkUpdateAsync(this.AsName, dataTable, whereColumns, updateColumns).ConfigureAwait(true).GetAwaiter().GetResult(); + } + public int BulkUpdate(DataTable dataTable, string[] whereColumns) + { + string[] updateColumns = dataTable.Columns.Cast().Select(it => it.ColumnName).Where(it => !whereColumns.Any(z => z.EqualCase(it))).ToArray(); + Check.ExceptionEasy(this.AsName.IsNullOrEmpty(), "need .AS(tablaeName) ", "需要 .AS(tablaeName) 设置表名"); + return BulkUpdateAsync(this.AsName, dataTable, whereColumns, updateColumns).ConfigureAwait(true).GetAwaiter().GetResult(); + } public async Task BulkUpdateAsync(string tableName, DataTable dataTable, string[] whereColumns, string[] updateColumns) { diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/MappingFieldsHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/MappingFieldsHelper.cs new file mode 100644 index 000000000..fafee5c00 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/MappingFieldsHelper.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + internal class MappingFieldsHelper + { + public SqlSugarProvider Context { get; set; } + public EntityInfo NavEntity { get; set; } + public EntityInfo RootEntity { get; set; } + + public MappingFieldsInfo GetMappings(Expression thisFiled, Expression mappingFiled) + { + MappingFieldsInfo mappingFields=new MappingFieldsInfo(); + var pkName = ""; + if ((mappingFiled as LambdaExpression).Body is UnaryExpression) + { + pkName = (((mappingFiled as LambdaExpression).Body as UnaryExpression).Operand as MemberExpression).Member.Name; + } + else + { + pkName = ((mappingFiled as LambdaExpression).Body as MemberExpression).Member.Name; + } + return mappingFields; + } + + public List GetMppingSql(List list, List mappingFieldsExpressions) + { + List conditionalModels = new List(); + foreach (var model in list) + { + var clist = new List>(); + var i = 0; + foreach (var item in mappingFieldsExpressions) + { + InitMappingFieldsExpression(item); + clist.Add(new KeyValuePair(i==0?WhereType.Or: WhereType.And, new ConditionalModel() + { + FieldName = item.LeftEntityColumn.DbColumnName, + ConditionalType = ConditionalType.Equal, + FieldValue = item.RightEntityColumn.PropertyInfo.GetValue(model).ObjToString(), + CSharpTypeName = item.RightEntityColumn.PropertyInfo.PropertyType.Name + })); + i++; + } + conditionalModels.Add(new ConditionalCollections() { + ConditionalList= clist + }); + } + return conditionalModels; + } + + public void SetChildList(EntityColumnInfo navColumnInfo,object item,List list, List mappingFieldsExpressions) + { + if (item != null) + { + //var expable =Expressionable.Create(); + foreach (var field in mappingFieldsExpressions) + { + InitMappingFieldsExpression(field); + } + var setList =new List(); + var count = mappingFieldsExpressions.Count; + if (count == 1) + { + setList=list.Where(it => GetWhereByIndex(item, mappingFieldsExpressions, it, 0)).ToList(); + } + else if (count == 2) + { + setList = list.Where(it => + GetWhereByIndex(item, mappingFieldsExpressions, it, 0) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 1) + ).ToList(); + } + else if (count == 3) + { + setList = list.Where(it => + GetWhereByIndex(item, mappingFieldsExpressions, it, 0) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 1) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 2) + ).ToList(); + } + else if (count == 4) + { + setList = list.Where(it => + GetWhereByIndex(item, mappingFieldsExpressions, it, 0) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 1) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 2) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 3) + ).ToList(); + } + else if (count == 5) + { + setList = list.Where(it => + GetWhereByIndex(item, mappingFieldsExpressions, it, 0) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 1) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 2) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 3) && + GetWhereByIndex(item, mappingFieldsExpressions, it, 4) + ).ToList(); + } + else + { + Check.ExceptionEasy("MappingField max value is 5", "MappingField最大数量不能超过5"); + } + //navColumnInfo.PropertyInfo.SetValue(); + var instance = Activator.CreateInstance(navColumnInfo.PropertyInfo.PropertyType, true); + var ilist = instance as IList; + foreach (var value in setList) + { + ilist.Add(value); + } + navColumnInfo.PropertyInfo.SetValue(item,ilist); + } + } + + private static bool GetWhereByIndex(object item, List mappingFieldsExpressions, object it,int index) + { + var left = mappingFieldsExpressions[index].LeftEntityColumn.PropertyInfo.GetValue(it).ObjToString(); + var right= mappingFieldsExpressions[index].RightEntityColumn.PropertyInfo.GetValue(item).ObjToString(); ; + return left == right; + } + + private void InitMappingFieldsExpression(MappingFieldsExpression item) + { + var leftName = item.LeftName; + var rightName = item.RightName; + if (item.LeftEntityColumn == null) + { + item.LeftEntityColumn = this.NavEntity.Columns.FirstOrDefault(it => it.PropertyName == leftName); + } + if (item.RightEntityColumn == null) + { + item.RightEntityColumn = this.RootEntity.Columns.FirstOrDefault(it => it.PropertyName == rightName); + } + } + + } + public class MappingFieldsInfo + { + public DbColumnInfo LeftColumn { get; set; } + public DbColumnInfo RightColumn { get; set; } + } + public class MappingFieldsExpression + { + public Expression LeftColumnExpression { get; set; } + public Expression RightColumnExpression { get; set; } + public EntityColumnInfo LeftEntityColumn { get; set; } + public EntityColumnInfo RightEntityColumn { get; set; } + private string _LeftName; + public string LeftName + { + get + { + if (_LeftName == null) + { + _LeftName = ExpressionTool.GetMemberName(this.LeftColumnExpression); + } + return _LeftName; + } + } + private string _RightName; + public string RightName + { + get + { + if (_RightName == null) + { + _RightName = ExpressionTool.GetMemberName(this.RightColumnExpression); + } + return _RightName; + } + } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index 681126425..c5b11d47d 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -165,6 +165,10 @@ namespace SqlSugar { OneToOne(list, selector, listItemEntity, navObjectNamePropety, navObjectNameColumnInfo); } + else if (navObjectNameColumnInfo.Navigat.NavigatType == NavigateType.Dynamic) + { + Dynamic(list, selector, listItemEntity, navObjectNamePropety, navObjectNameColumnInfo); + } else { ManyToMany(list, selector, listItemEntity, navObjectNamePropety, navObjectNameColumnInfo); @@ -236,7 +240,17 @@ namespace SqlSugar ilist.Add(bInfo); } } - navObjectNamePropety.SetValue(listItem, instance); + if (sql.MappingExpressions.HasValue()) + { + MappingFieldsHelper helper = new MappingFieldsHelper(); + helper.NavEntity = bEntityInfo; + helper.RootEntity = this.Context.EntityMaintenance.GetEntityInfo(); + helper.SetChildList(navObjectNameColumnInfo, listItem, ilist.Cast().ToList(), sql.MappingExpressions); + } + else + { + navObjectNamePropety.SetValue(listItem, instance); + } } } } @@ -300,18 +314,54 @@ namespace SqlSugar { var setValue = navList .Where(x => navColumn.PropertyInfo.GetValue(x).ObjToString() == listItemPkColumn.PropertyInfo.GetValue(item).ObjToString()).ToList(); - var instance = Activator.CreateInstance(navObjectNamePropety.PropertyType, true); - var ilist = instance as IList; - foreach (var value in setValue) + + if (sqlObj.MappingExpressions.HasValue()) { - ilist.Add(value); + MappingFieldsHelper helper = new MappingFieldsHelper(); + helper.NavEntity = navEntityInfo; + helper.RootEntity = this.Context.EntityMaintenance.GetEntityInfo(); + helper.SetChildList(navObjectNameColumnInfo, item,setValue,sqlObj.MappingExpressions); + } + else + { + + var instance = Activator.CreateInstance(navObjectNamePropety.PropertyType, true); + var ilist = instance as IList; + foreach (var value in setValue) + { + ilist.Add(value); + } + navObjectNamePropety.SetValue(item, instance); } - navObjectNamePropety.SetValue(item, instance); } } } } + private void Dynamic(List list, Func, List> selector, EntityInfo listItemEntity, System.Reflection.PropertyInfo navObjectNamePropety, EntityColumnInfo navObjectNameColumnInfo) + { + var navEntity = navObjectNameColumnInfo.PropertyInfo.PropertyType.GetGenericArguments()[0]; + var navEntityInfo = this.Context.EntityMaintenance.GetEntityInfo(navEntity); + var sqlObj = GetWhereSql(navObjectNameColumnInfo.Navigat.Name); + Check.ExceptionEasy(sqlObj.MappingExpressions.IsNullOrEmpty(), $"Dynamic need MappingField ,Demo: Includes(it => it.Books.MappingField(z=>z.studenId,()=>it.StudentId).ToList())", $"自定义映射需要 MappingFields ,例子: Includes(it => it.Books.MappingFields(z=>z.studenId,()=>it.StudentId).ToList())"); + if (list.Any() && navObjectNamePropety.GetValue(list.First()) == null) + { + MappingFieldsHelper helper = new MappingFieldsHelper(); + helper.Context = this.Context; + helper.NavEntity = navEntityInfo; + helper.RootEntity = this.Context.EntityMaintenance.GetEntityInfo(); + var whereSql = helper.GetMppingSql(RootList,sqlObj.MappingExpressions); + var navList = selector(this.Context.Queryable().AS(navEntityInfo.DbTableName).AddParameters(sqlObj.Parameters).Where(whereSql,true).WhereIF(sqlObj.WhereString.HasValue(), sqlObj.WhereString).Select(sqlObj.SelectString).OrderByIF(sqlObj.OrderByString.HasValue(), sqlObj.OrderByString)); + if (navList.HasValue()) + { + foreach (var item in list) + { + helper.SetChildList(navObjectNameColumnInfo, item, navList, sqlObj.MappingExpressions); + } + } + } + + } private SqlInfo GetWhereSql(string properyName=null) { if (_ListCallFunc == null|| _ListCallFunc.Count==0) return new SqlInfo(); @@ -327,6 +377,7 @@ namespace SqlSugar var queryable = this.Context.Queryable(); if (method.Method.Name == "Where") { + CheckHasRootShortName(method.Arguments[0], method.Arguments[1]); var exp = method.Arguments[1]; where.Add(" " +queryable.QueryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString()); } @@ -336,6 +387,7 @@ namespace SqlSugar if (isOk.ObjToBool()) { var exp = method.Arguments[2]; + CheckHasRootShortName(method.Arguments[1], method.Arguments[2]); where.Add(" " + queryable.QueryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString()); } } @@ -344,6 +396,16 @@ namespace SqlSugar var exp = method.Arguments[1]; oredrBy.Add(" " + queryable.QueryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString()); } + else if (method.Method.Name == "MappingField") + { + if (result.MappingExpressions == null) + result.MappingExpressions = new List(); + result.MappingExpressions.Add(new MappingFieldsExpression() + { + LeftColumnExpression = method.Arguments[1], + RightColumnExpression = method.Arguments[2] + }); + } else if (method.Method.Name == "Select") { var exp = method.Arguments[1]; @@ -370,7 +432,7 @@ namespace SqlSugar foreach (var nav in entityInfo.Columns.Where(x => x.Navigat != null&&x.Navigat.NavigatType==NavigateType.OneToOne)) { var navColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName == nav.Navigat.Name); - if (navColumn != null) + if (navColumn != null) { AppColumns(result, queryable, navColumn.DbColumnName); } @@ -405,17 +467,17 @@ namespace SqlSugar } if (where.Any()) { - Check.Exception(isList == false, $"{_ListCallFunc.First()} need is ToList()", $"{_ListCallFunc.First()} 需要ToList"); + Check.ExceptionEasy(isList == false, $"{_ListCallFunc.First()} need is ToList()", $"{_ListCallFunc.First()} 需要ToList"); result.WhereString= String.Join(" AND ", where); } if (oredrBy.Any()) { - Check.Exception(isList == false, $"{_ListCallFunc.First()} need is ToList()", $"{_ListCallFunc.First()} 需要ToList"); + Check.ExceptionEasy(isList == false, $"{_ListCallFunc.First()} need is ToList()", $"{_ListCallFunc.First()} 需要ToList"); result.OrderByString = String.Join(" , ", oredrBy); } if (result.SelectString.HasValue()) { - Check.Exception(isList == false, $"{_ListCallFunc.First()} need is ToList()", $"{_ListCallFunc.First()} 需要ToList"); + Check.ExceptionEasy(isList == false, $"{_ListCallFunc.First()} need is ToList()", $"{_ListCallFunc.First()} 需要ToList"); result.OrderByString = String.Join(" , ", oredrBy); } return result; @@ -429,6 +491,31 @@ namespace SqlSugar result.SelectString = result.SelectString + "," + selectPkName; } } + private void CheckHasRootShortName(Expression rootExpression, Expression childExpression) + { + var rootShortName = GetShortName(rootExpression); + if (rootShortName.HasValue()&& childExpression.ToString().Contains($"{rootShortName}.")) + { + Check.ExceptionEasy($".Where({childExpression}) no support {rootShortName}.Field, Use .MappingField",$".Where({childExpression})禁止出{rootShortName}.字段 , 你可以使用.MappingField(z=>z.字段,()=>{rootShortName}.字段) 与主表字段进行过滤"); + } + } + + private static string GetShortName(Expression expression1) + { + string shortName = null; + if (expression1 is MemberExpression) + { + var shortNameExpression = (expression1 as MemberExpression).Expression; + if (shortNameExpression != null && shortNameExpression.Type == typeof(T)) + { + if (shortNameExpression is ParameterExpression) + { + shortName = (shortNameExpression as ParameterExpression).Name; + } + } + } + return shortName; + } public class SqlInfo { @@ -436,6 +523,7 @@ namespace SqlSugar public string OrderByString { get; set; } public string SelectString { get; set; } public List Parameters { get; set; } + public List MappingExpressions { get; set; } } } diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 78c7d7fc1..a8e0c85ef 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -380,6 +380,31 @@ namespace SqlSugar _WhereClassByPrimaryKey(new List() { data }); return this; } + public ISugarQueryable WhereColumns(List> list) + { + List conditionalModels = new List(); + foreach (var model in list) + { + int i = 0; + var clist = new List>(); + foreach (var item in model.Keys) + { + clist.Add(new KeyValuePair(i == 0 ? WhereType.Or : WhereType.And, new ConditionalModel() + { + FieldName = item, + ConditionalType = ConditionalType.Equal, + FieldValue = model[item].ObjToString(), + CSharpTypeName = model[item] == null ? null : model[item].GetType().Name + })); + i++; + } + conditionalModels.Add(new ConditionalCollections() + { + ConditionalList = clist + }); + } + return this.Where(conditionalModels); + } /// /// if a property that is primary key is a condition @@ -536,7 +561,19 @@ namespace SqlSugar var sqlObj = this.SqlBuilder.ConditionalModelToSql(conditionalModels,0); return this.Where(sqlObj.Key, sqlObj.Value); } - + public ISugarQueryable Where(List conditionalModels, bool isWrap) + { + if (conditionalModels.IsNullOrEmpty()) return this; + var sqlObj = this.SqlBuilder.ConditionalModelToSql(conditionalModels, 0); + if (isWrap) + { + return this.Where("("+sqlObj.Key+")", sqlObj.Value); + } + else + { + return this.Where(sqlObj.Key, sqlObj.Value); + } + } public virtual ISugarQueryable Where(string whereString, object whereObj = null) { var whereValue = QueryBuilder.WhereInfos; @@ -1856,7 +1893,7 @@ namespace SqlSugar public Task> ToPageListAsync(int pageNumber, int pageSize, RefAsync totalNumber, RefAsync totalPage) { var result = ToPageListAsync(pageNumber, pageSize, totalNumber); - totalPage = (totalNumber + pageSize - 1) / pageSize; + totalPage.Value = (totalNumber + pageSize - 1) / pageSize; return result; } public async Task ToJsonAsync() @@ -2332,6 +2369,13 @@ namespace SqlSugar _InitNavigat(result); return result; } + private async Task _InitNavigatAsync(List result) + { + if (this.QueryBuilder.Includes != null) + { + await Task.Run(() => { _InitNavigat(result); }); + } + } private void _InitNavigat(List result) { @@ -2366,7 +2410,7 @@ namespace SqlSugar } RestoreMapping(); _Mapper(result); - await Task.Run(() => { _InitNavigat(result); }); + await _InitNavigatAsync(result); return result; } diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs index 8fff99f08..fe139d9d7 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs @@ -158,9 +158,9 @@ namespace SqlSugar if (this.whereExpression != null) { result.AsUpdateable.WhereColumns(whereExpression); - result.AsDeleteable.WhereColumns(whereExpression); + result.AsDeleteable.WhereColumns(update.Select(it => it.Item).ToList(),whereExpression); } - result.AsDeleteable.Where(delete.Select(it => it.Item).ToList()); + //result.AsDeleteable.Where(delete.Select(it => it.Item).ToList()); return result; } @@ -240,9 +240,9 @@ namespace SqlSugar if (this.whereExpression != null) { result.AsUpdateable.WhereColumns(whereExpression); - result.AsDeleteable.WhereColumns(whereExpression); + result.AsDeleteable.WhereColumns(delete.Select(it => it.Item).ToList(),whereExpression); } - result.AsDeleteable.Where(delete.Select(it => it.Item).ToList()); + //result.AsDeleteable.Where(delete.Select(it => it.Item).ToList()); return result; } diff --git a/Src/Asp.NetCore2/SqlSugar/Enum/NavigatType.cs b/Src/Asp.NetCore2/SqlSugar/Enum/NavigatType.cs index 4788ac21c..938d68fae 100644 --- a/Src/Asp.NetCore2/SqlSugar/Enum/NavigatType.cs +++ b/Src/Asp.NetCore2/SqlSugar/Enum/NavigatType.cs @@ -11,6 +11,7 @@ namespace SqlSugar OneToOne=1, OneToMany=2, ManyToOne=3, - ManyToMany=4, + ManyToMany=4, + Dynamic=5 } } diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index 26b6e016e..18100ccef 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -183,6 +183,51 @@ namespace SqlSugar return reval; } + internal static Expression RemoveConvert(Expression item) + { + for (int i = 0; i < 10; i++) + { + if ((item is UnaryExpression) && (item as UnaryExpression).NodeType == ExpressionType.Convert) + { + item = (item as UnaryExpression).Operand; + } + else + { + break; + } + } + return item; + } + internal static Expression RemoveConvertThanOne(Expression item) + { + for (int i = 0; i < 10; i++) + { + if ((item is UnaryExpression) + && (item as UnaryExpression).NodeType == ExpressionType.Convert + && (item as UnaryExpression).Operand is UnaryExpression) + { + item = (item as UnaryExpression).Operand; + } + else + { + break; + } + } + return item; + } + public static string GetMemberName(Expression expression) + { + if (expression is LambdaExpression) + { + expression = (expression as LambdaExpression).Body; + } + if (expression is UnaryExpression) + { + expression = ((UnaryExpression)expression).Operand; + } + var member = (expression as MemberExpression).Member.Name; + return member; + } internal static object GetExpressionValue(Expression expression) { try diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs index 603562c81..6f52fdcdb 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/MemberInitExpressionResolve.cs @@ -130,24 +130,12 @@ namespace SqlSugar } else if (IsConst(item)) { - base.Expression = item; + base.Expression =ExpressionTool.RemoveConvertThanOne(item); base.Start(); string parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.Const + this.Context.ParameterIndex; parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameterName)); var addItem = new SugarParameter(parameterName, parameter.CommonTempData); - var dataType = UtilMethods.GetUnderType(item.Type); - if (addItem.Value == null && dataType == UtilConstants.DateType) - { - addItem.DbType = System.Data.DbType.Date; - } - if (addItem.Value == null && dataType.IsIn(UtilConstants.FloatType,UtilConstants.IntType,UtilConstants.LongType,UtilConstants.DecType,UtilConstants.DobType)) - { - addItem.DbType = System.Data.DbType.Int32; - } - if (addItem.Value == null && dataType == UtilConstants.BoolType) - { - addItem.DbType = System.Data.DbType.Boolean; - } + ConvertParameterTypeByType(item, addItem); this.Context.Parameters.Add(addItem); this.Context.ParameterIndex++; @@ -163,6 +151,16 @@ namespace SqlSugar base.Start(); parameter.IsAppendResult(); parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameter.CommonTempData.ObjToString())); + + if (this.Context.Parameters != null) + { + var memberParameter = this.Context.Parameters?.FirstOrDefault(it =>it.Value==null && it.ParameterName == parameter.CommonTempData.ObjToString()); + if (memberParameter != null) + { + ConvertParameterTypeByType(item, memberParameter); + } + } + base.Context.Result.CurrentParameter = null; } } @@ -208,6 +206,24 @@ namespace SqlSugar } } } + + private static void ConvertParameterTypeByType(Expression item, SugarParameter addItem) + { + var dataType = UtilMethods.GetUnderType(item.Type); + if (addItem.Value == null && dataType == UtilConstants.DateType) + { + addItem.DbType = System.Data.DbType.Date; + } + if (addItem.Value == null && dataType.IsIn(UtilConstants.FloatType, UtilConstants.IntType, UtilConstants.LongType, UtilConstants.DecType, UtilConstants.DobType)) + { + addItem.DbType = System.Data.DbType.Int32; + } + if (addItem.Value == null && dataType == UtilConstants.BoolType) + { + addItem.DbType = System.Data.DbType.Boolean; + } + } + private static bool IsConst(Expression item) { return item is UnaryExpression || item.NodeType == ExpressionType.Constant || (item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant; diff --git a/Src/Asp.NetCore2/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.NetCore2/SqlSugar/Infrastructure/ContextMethods.cs index cd507473d..7c8017606 100644 --- a/Src/Asp.NetCore2/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar/Infrastructure/ContextMethods.cs @@ -543,6 +543,30 @@ namespace SqlSugar #endregion #region DataTable + public DataTable DictionaryListToDataTable(List> list) + { + DataTable result = new DataTable(); + if (list.Count == 0) + return result; + + var columnNames = list.First(); + foreach (var item in columnNames) + { + result.Columns.Add(item.Key,item.Value==null?typeof(object):item.Value.GetType()); + } + foreach (var item in list) + { + var row = result.NewRow(); + foreach (var key in item.Keys) + { + row[key] = item[key]; + } + + result.Rows.Add(row); + } + + return result; + } public dynamic DataTableToDynamic(DataTable table) { List> deserializeObject = new List>(); diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IContextMethods.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IContextMethods.cs index 78b844c15..95f71262a 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IContextMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IContextMethods.cs @@ -38,5 +38,6 @@ namespace SqlSugar Task PageEachAsync(IEnumerable pageItems, int pageSize, Func, Task> action); Task PageEachAsync(IEnumerable pageItems, int pageSize, Func, Task> action); List JsonToConditionalModels(string json); + DataTable DictionaryListToDataTable(List> dictionaryList); } } diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IDeleteable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IDeleteable.cs index e5049a219..8d22d39de 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IDeleteable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IDeleteable.cs @@ -29,7 +29,8 @@ namespace SqlSugar IDeleteable Where(string whereString, SugarParameter parameter); IDeleteable Where(string whereString, SugarParameter[] parameters); IDeleteable Where(string whereString, List parameters); - IDeleteable WhereColumns(Expression> columns); + IDeleteable WhereColumns(List list,Expression> columns); + IDeleteable WhereColumns(List> columns); IDeleteable Where(List conditionalModels); IDeleteable EnableDiffLogEvent(object businessData = null); IDeleteable RemoveDataCache(); diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IFastest.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IFastest.cs index f36cd2954..34eac10bc 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IFastest.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IFastest.cs @@ -16,6 +16,7 @@ namespace SqlSugar int BulkCopy(List datas); Task BulkCopyAsync(List datas); int BulkCopy(string tableName,DataTable dataTable); + int BulkCopy(DataTable dataTable); Task BulkCopyAsync(string tableName, DataTable dataTable); int BulkUpdate(List datas); @@ -23,6 +24,8 @@ namespace SqlSugar int BulkUpdate(List datas, string[] whereColumns, string[] updateColumns); Task BulkUpdateAsync(List datas, string[] whereColumns, string[] updateColumns); int BulkUpdate(string tableName,DataTable dataTable, string[] whereColumns, string[] updateColumns); + int BulkUpdate(DataTable dataTable, string[] whereColumns, string[] updateColumns); + int BulkUpdate(DataTable dataTable, string[] whereColumns); Task BulkUpdateAsync(string tableName, DataTable dataTable, string[] whereColumns, string[] updateColumns); SplitFastest SplitTable(); } diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs index 982f8a5e1..794d5f9f1 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IQueryable.cs @@ -52,10 +52,11 @@ namespace SqlSugar ISugarQueryable WhereClass(List whereClassList,bool ignoreDefaultValue = false) where ClassType : class, new(); ISugarQueryable WhereClassByPrimaryKey(List list); ISugarQueryable WhereClassByPrimaryKey(T data) ; + ISugarQueryable WhereColumns(List> columns); ISugarQueryable Where(Expression> expression); ISugarQueryable Where(string whereString, object parameters = null); ISugarQueryable Where(List conditionalModels); - + ISugarQueryable Where(List conditionalModels,bool isWrap); ISugarQueryable Having(Expression> expression); ISugarQueryable Having(string whereString, object parameters = null); diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/ISimpleClient.cs b/Src/Asp.NetCore2/SqlSugar/Interface/ISimpleClient.cs index 3e11cf710..2d048ed34 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/ISimpleClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/ISimpleClient.cs @@ -23,6 +23,7 @@ namespace SqlSugar int Count(Expression> whereExpression); bool Delete(Expression> whereExpression); bool Delete(T deleteObj); + bool Delete(List deleteObjs); bool DeleteById(dynamic id); bool DeleteByIds(dynamic[] ids); T GetById(dynamic id); @@ -55,6 +56,7 @@ namespace SqlSugar Task CountAsync(Expression> whereExpression); Task DeleteAsync(Expression> whereExpression); Task DeleteAsync(T deleteObj); + Task DeleteAsync(List deleteObjs); Task DeleteByIdAsync(dynamic id); Task DeleteByIdsAsync(dynamic[] ids); Task GetByIdAsync(dynamic id); diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/OracleProvider.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/OracleProvider.cs index 0e10d180c..8c3d39a1d 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/OracleProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/OracleProvider.cs @@ -21,6 +21,10 @@ namespace SqlSugar if (exceptionalCaseInfo != null) { foreach (var item in exceptionalCaseInfo.Cast()) { + if (item.Value != null && item.Value.IndexOf(",") == 1&&Regex.IsMatch(item.Value, @"^ \,\@\w+$")) + { + break; + } sql = sql.Replace(item.Value, item.Value.Replace("@", UtilConstants.ReplaceKey)); } } diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs index 65f434ecf..1d54b41af 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleInsertBuilder.cs @@ -136,8 +136,10 @@ namespace SqlSugar } else if (type == UtilConstants.ByteArrayType) { - string bytesString = "0x" + BitConverter.ToString((byte[])value).Replace("-", ""); - return bytesString; + ++i; + var parameterName = this.Builder.SqlParameterKeyWord + name + i; + this.Parameters.Add(new SugarParameter(parameterName, value,System.Data.DbType.Binary)); + return parameterName; } else if (type == UtilConstants.BoolType) { @@ -150,7 +152,7 @@ namespace SqlSugar } else if (type == UtilConstants.StringType || type == UtilConstants.ObjType) { - if (value.ToString().Length > 2000) + if (value.ToString().Length > 1000) { ++i; var parameterName = this.Builder.SqlParameterKeyWord + name + i; diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs index 39b834221..ebce18d47 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/Oracle/SqlBuilder/OracleUpdateBuilder.cs @@ -94,7 +94,7 @@ namespace SqlSugar } else if (type == UtilConstants.StringType || type == UtilConstants.ObjType) { - if (value.ToString().Length > 2000) + if (value.ToString().Length > 1000) { ++i; var parameterName = this.Builder.SqlParameterKeyWord + name + i; diff --git a/Src/Asp.NetCore2/SqlSugar/SimpleClient.cs b/Src/Asp.NetCore2/SqlSugar/SimpleClient.cs index 1dee4c5cf..e4ba9daa0 100644 --- a/Src/Asp.NetCore2/SqlSugar/SimpleClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/SimpleClient.cs @@ -200,6 +200,10 @@ namespace SqlSugar { return this.Context.Deleteable().Where(deleteObj).ExecuteCommand() > 0; } + public virtual bool Delete(List deleteObjs) + { + return this.Context.Deleteable().Where(deleteObjs).ExecuteCommand() > 0; + } public virtual bool Delete(Expression> whereExpression) { return this.Context.Deleteable().Where(whereExpression).ExecuteCommand() > 0; @@ -314,6 +318,10 @@ namespace SqlSugar { return await this.Context.Deleteable().Where(deleteObj).ExecuteCommandAsync() > 0; } + public virtual async Task DeleteAsync(List deleteObjs) + { + return await this.Context.Deleteable().Where(deleteObjs).ExecuteCommandAsync() > 0; + } public virtual async Task DeleteAsync(Expression> whereExpression) { return await this.Context.Deleteable().Where(whereExpression).ExecuteCommandAsync() > 0; diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs index 400f69612..b81fd5cc6 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs @@ -365,6 +365,12 @@ namespace SqlSugar { return this.Context.Storageable(data); } + public StorageableDataTable Storageable(List> dictionaryList,string tableName) + { + DataTable dt = this.Context.Utilities.DictionaryListToDataTable(dictionaryList); + dt.TableName = tableName; + return this.Context.Storageable(dt); + } public IStorageable Storageable(List dataList) where T : class, new() { diff --git a/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs b/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs index 086658cc6..b77e8f834 100644 --- a/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs +++ b/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs @@ -20,5 +20,9 @@ namespace SqlSugar return thisValue; } } + public static IEnumerable MappingField(this IEnumerable thisValue,Func leftField, Func rightField) + { + return thisValue; + } } }