From 9b89ed3780410404a639923b420a9aebffd56dcc Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Thu, 15 Jun 2023 14:45:44 +0800 Subject: [PATCH] Synchronization code --- .../InsertNavProviderHelper.cs | 2 +- .../QueryableProvider/QueryMethodInfo.cs | 129 ++++++++++++++++-- .../Abstract/SaveableProvider/Storageable.cs | 80 +++++++++++ .../SugarProvider/SqlSugarProvider.cs | 5 + .../SugarProvider/SqlSugarScopeProvider.cs | 4 + .../SqlSugar/Infrastructure/ContextMethods.cs | 1 - .../SqlSugar/Infrastructure/StaticConfig.cs | 2 + .../SqlSugar/Interface/ISqlSugarClient.cs | 1 + .../SqlSugar/Interface/IStorageable.cs | 1 + .../SqlSugar/SpliteTable/SplitTableContext.cs | 4 + Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs | 4 + Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs | 4 + .../SqlSugar/Utilities/CommonExtensions.cs | 9 ++ 13 files changed, 232 insertions(+), 14 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs index ec674bb04..1e5b34e5f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/ExecuteNavProvider/InsertNavProviderHelper.cs @@ -99,7 +99,7 @@ namespace SqlSugar { Check.ExceptionEasy($"{typeof(TChild).Name} need primary key ", $"{typeof(TChild).Name}需要主键"); } - var x = this._Context.Storageable(children).WhereColumns(new string[] { pkColumn.PropertyName }).ToStorage(); + var x = this._Context.Storageable(children).WhereColumns(new string[] { pkColumn.PropertyName }).GetStorageableResult(); var insertData = children = x.InsertList.Select(it => it.Item).ToList(); var IsNoExistsNoInsert = _navOptions != null && _navOptions.OneToManyIfExistsNoInsert == true; if (_NavigateType == NavigateType.OneToMany && IsFirst == false && IsNoExistsNoInsert == false) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs index fcb157917..fb75511ff 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs @@ -1,33 +1,122 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; - + + namespace SqlSugar { public class QueryMethodInfo { public object QueryableObj { get; internal set; } public SqlSugarProvider Context { get; internal set; } + public Type EntityType { get; set; } - public QueryMethodInfo Where(string sql, object parameters) + + #region Json 2 sql api + #endregion + + #region Sql API + public QueryMethodInfo AS(string tableName) { - var method = QueryableObj.GetType().GetMyMethod("Where", 2, typeof(string), typeof(object)); - this.QueryableObj= method.Invoke(QueryableObj, new object[] { sql, parameters }); + string shortName = $"{tableName}_1"; + var method = QueryableObj.GetType().GetMyMethod("AS", 2, typeof(string), typeof(string)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { tableName, shortName }); + return this; + } + public QueryMethodInfo AS(string tableName, string shortName) + { + var method = QueryableObj.GetType().GetMyMethod("AS", 2, typeof(string), typeof(string)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { tableName, shortName }); + return this; + } + public QueryMethodInfo OrderBy(List models) + { + var method = QueryableObj.GetType().GetMyMethod("OrderBy", 1, typeof(List)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { models }); + return this; + } + public QueryMethodInfo OrderBy(string orderBySql) + { + var method = QueryableObj.GetType().GetMyMethod("OrderBy", 1, typeof(string)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { orderBySql }); + return this; + } + public QueryMethodInfo AddJoinInfo(string tableName, string shortName,string onWhere, JoinType type = JoinType.Left) + { + var method = QueryableObj.GetType().GetMyMethod("AddJoinInfo", 4, typeof(string),typeof(string),typeof(string),typeof(JoinType)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { tableName,shortName,onWhere,type }); + return this; + } + public QueryMethodInfo AddJoinInfo(Type joinEntityType, string shortName, string onWhere, JoinType type = JoinType.Left) + { + var method = QueryableObj.GetType().GetMyMethod("AddJoinInfo", 4, typeof(string), typeof(string), typeof(string), typeof(JoinType)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { this.Context.EntityMaintenance.GetTableName(joinEntityType), shortName, onWhere, type }); + return this; + } + public QueryMethodInfo GroupBy(List models) + { + var method = QueryableObj.GetType().GetMyMethod("GroupBy", 1, typeof(List)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { models }); + return this; + } + public QueryMethodInfo GroupBy(string groupBySql) + { + var method = QueryableObj.GetType().GetMyMethod("GroupBy", 1, typeof(string)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { groupBySql }); + return this; + } + + public QueryMethodInfo Where(List conditionalModels) + { + var method = QueryableObj.GetType().GetMyMethod("Where", 1, typeof(List)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { conditionalModels }); + return this; + } + + public QueryMethodInfo Where(IFuncModel model) + { + var method = QueryableObj.GetType().GetMyMethod("Where", 1, typeof(IFuncModel)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { model }); + return this; + } + + public QueryMethodInfo Where(List conditionalModels, bool isWrap) + { + var method = QueryableObj.GetType().GetMyMethod("Where", 2, typeof(List),typeof(bool)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { conditionalModels,isWrap }); + return this; + } + public QueryMethodInfo Where(string sql, object parameters = null) + { + var method = QueryableObj.GetType().GetMyMethod("Where", 2, typeof(string), typeof(object)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { sql, parameters }); + return this; + } + public QueryMethodInfo Having(IFuncModel model) + { + var method = QueryableObj.GetType().GetMyMethod("Having", 1, typeof(IFuncModel)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] {model}); + return this; + } + public QueryMethodInfo Having(string sql, object parameters = null) + { + var method = QueryableObj.GetType().GetMyMethod("Having", 2, typeof(string), typeof(object)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { sql, parameters }); return this; } - public QueryMethodInfo SplitTable(Func, IEnumerable> getTableNamesFunc) { var method = QueryableObj.GetType().GetMyMethod("SplitTable", 1, typeof(Func, IEnumerable>)); - this.QueryableObj = method.Invoke(QueryableObj, new object[] { getTableNamesFunc}); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { getTableNamesFunc }); return this; } - public QueryMethodInfo SplitTable(DateTime begintTime,DateTime endTime) + public QueryMethodInfo SplitTable(DateTime begintTime, DateTime endTime) { var method = QueryableObj.GetType().GetMyMethod("SplitTable", 2, typeof(DateTime), typeof(DateTime)); - this.QueryableObj = method.Invoke(QueryableObj, new object[] {begintTime,endTime }); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { begintTime, endTime }); return this; } public QueryMethodInfo SplitTable() @@ -36,15 +125,31 @@ namespace SqlSugar this.QueryableObj = method.Invoke(QueryableObj, new object[] { }); return this; } - - public QueryMethodInfo Select(string selectorSql, Type selectType) + + public QueryMethodInfo Select(List models) { - var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(string)) + var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(List)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { models }); + return this; + } + public QueryMethodInfo Select(string selectorSql) + { + var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(string)) + .MakeGenericMethod(EntityType); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { selectorSql }); + return this; + } + + public QueryMethodInfo Select(string selectorSql, Type selectType) + { + var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(string)) .MakeGenericMethod(selectType); this.QueryableObj = method.Invoke(QueryableObj, new object[] { selectorSql }); return this; } - + + #endregion + #region Result public object ToPageList(int pageNumber, int pageSize) { diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs index 79c11a18f..99ded5795 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SaveableProvider/Storageable.cs @@ -211,6 +211,86 @@ namespace SqlSugar return result; } + public StorageableResult GetStorageableResult() + { + if (whereFuncs == null || whereFuncs.Count == 0) + { + return this.Saveable().GetStorageableResult(); + } + if (this.allDatas.Count == 0) + return new StorageableResult() + { + //AsDeleteable = this.Context.Deleteable().AS(asname).Where(it => false), + //AsInsertable = this.Context.Insertable(new List()).AS(asname), + //AsUpdateable = this.Context.Updateable(new List()).AS(asname), + InsertList = new List>(), + UpdateList = new List>(), + DeleteList = new List>(), + ErrorList = new List>(), + IgnoreList = new List>(), + OtherList = new List>(), + TotalList = new List>() + }; + var pkInfos = this.Context.EntityMaintenance.GetEntityInfo().Columns.Where(it => it.IsPrimarykey); + if (whereExpression == null && !pkInfos.Any()) + { + Check.ExceptionEasy(true, "Need primary key or WhereColumn", "使用Storageable实体需要主键或者使用WhereColumn指定条件列"); + } + if (whereExpression == null && pkInfos.Any()) + { + this.Context.Utilities.PageEach(allDatas, 300, item => { + var addItems = this.Context.Queryable().Filter(null, this.isDisableFilters).TranLock(this.lockType).AS(asname).WhereClassByPrimaryKey(item.Select(it => it.Item).ToList()).ToList(); + dbDataList.AddRange(addItems); + }); + } + var pkProperties = GetPkProperties(pkInfos); + var messageList = allDatas.Select(it => new StorageableMessage() + { + Item = it.Item, + Database = dbDataList, + PkFields = pkProperties + }).ToList(); + foreach (var item in whereFuncs.OrderByDescending(it => (int)it.key)) + { + List> whereList = messageList.Where(it => it.StorageType == null).ToList(); + Func, bool> exp = item.value1; + var list = whereList.Where(exp).ToList(); + foreach (var it in list) + { + it.StorageType = item.key; + it.StorageMessage = item.value2; + } + } + var delete = messageList.Where(it => it.StorageType == StorageType.Delete).ToList(); + var update = messageList.Where(it => it.StorageType == StorageType.Update).ToList(); + var inset = messageList.Where(it => it.StorageType == StorageType.Insert).ToList(); + var error = messageList.Where(it => it.StorageType == StorageType.Error).ToList(); + var ignore = messageList.Where(it => it.StorageType == StorageType.Ignore || it.StorageType == null).ToList(); + var other = messageList.Where(it => it.StorageType == StorageType.Other).ToList(); + StorageableResult result = new StorageableResult() + { + _WhereColumnList = wherecolumnList, + _AsName = asname, + _Context = this.Context, + //AsDeleteable = this.Context.Deleteable().AS(asname), + //AsUpdateable = this.Context.Updateable(update.Select(it => it.Item).ToList()).AS(asname), + //AsInsertable = this.Context.Insertable(inset.Select(it => it.Item).ToList()).AS(asname), + OtherList = other, + InsertList = inset, + DeleteList = delete, + UpdateList = update, + ErrorList = error, + IgnoreList = ignore, + TotalList = messageList + }; + //if (this.whereExpression != null) + //{ + // result.AsUpdateable.WhereColumns(whereExpression); + // result.AsDeleteable.WhereColumns(update.Select(it => it.Item).ToList(), whereExpression); + //} + //result.AsDeleteable.Where(delete.Select(it => it.Item).ToList()); + return result; + } public async Task> ToStorageAsync() { diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index 1ff133957..f8a2ba79f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -90,8 +90,13 @@ namespace SqlSugar var queryableObj=methodT.Invoke(this,new object[] {}); result.QueryableObj = queryableObj; result.Context = this.Context; + result.EntityType = entityType; return result; } + public QueryMethodInfo QueryableByObject(Type entityType, string shortName) + { + return this.QueryableByObject(entityType).AS(this.Context.EntityMaintenance.GetTableName(entityType),shortName); + } /// /// Get datebase time /// diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs index e316e3f05..dcf36ba29 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs @@ -819,6 +819,10 @@ namespace SqlSugar { return ScopedContext.QueryableByObject(entityType); } + public QueryMethodInfo QueryableByObject(Type entityType, string shortName) + { + return ScopedContext.QueryableByObject(entityType, shortName); + } #endregion } } \ No newline at end of file diff --git a/Src/Asp.NetCore2/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.NetCore2/SqlSugar/Infrastructure/ContextMethods.cs index fedea21da..55d78a1b5 100644 --- a/Src/Asp.NetCore2/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar/Infrastructure/ContextMethods.cs @@ -4,7 +4,6 @@ using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.Common; -using System.DirectoryServices.ActiveDirectory; using System.Dynamic; using System.Linq; using System.Linq.Expressions; diff --git a/Src/Asp.NetCore2/SqlSugar/Infrastructure/StaticConfig.cs b/Src/Asp.NetCore2/SqlSugar/Infrastructure/StaticConfig.cs index 658545eee..170e88a45 100644 --- a/Src/Asp.NetCore2/SqlSugar/Infrastructure/StaticConfig.cs +++ b/Src/Asp.NetCore2/SqlSugar/Infrastructure/StaticConfig.cs @@ -17,5 +17,7 @@ namespace SqlSugar public static Action CompleteUpdateableFunc; public static Action CompleteDeleteableFunc; public static Action CompleteDbFunc; + + public static Func> SplitTableGetTablesFunc; } } diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs index 1ba7cbb1c..43fab587d 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs @@ -79,6 +79,7 @@ namespace SqlSugar #endregion #region Queryable + QueryMethodInfo QueryableByObject(Type entityType, string shortName); QueryMethodInfo QueryableByObject(Type entityType); ISugarQueryable MasterQueryable(); ISugarQueryable SlaveQueryable(); diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/IStorageable.cs b/Src/Asp.NetCore2/SqlSugar/Interface/IStorageable.cs index 82793b3b2..8bed2d866 100644 --- a/Src/Asp.NetCore2/SqlSugar/Interface/IStorageable.cs +++ b/Src/Asp.NetCore2/SqlSugar/Interface/IStorageable.cs @@ -23,6 +23,7 @@ namespace SqlSugar IStorageable SplitDelete(Func, bool> conditions, string message = null); IStorageable SplitOther(Func, bool> conditions, string message = null); StorageableResult ToStorage(); + StorageableResult GetStorageableResult(); Task> ToStorageAsync(); IStorageable As(string tableName); int ExecuteCommand(); diff --git a/Src/Asp.NetCore2/SqlSugar/SpliteTable/SplitTableContext.cs b/Src/Asp.NetCore2/SqlSugar/SpliteTable/SplitTableContext.cs index f222a4c6b..0966cb757 100644 --- a/Src/Asp.NetCore2/SqlSugar/SpliteTable/SplitTableContext.cs +++ b/Src/Asp.NetCore2/SqlSugar/SpliteTable/SplitTableContext.cs @@ -54,6 +54,10 @@ namespace SqlSugar } public List GetTables() { + if (StaticConfig.SplitTableGetTablesFunc != null) + { + return StaticConfig.SplitTableGetTablesFunc(); + } var oldIsEnableLogEvent = this.Context.Ado.IsEnableLogEvent; this.Context.Ado.IsEnableLogEvent = false; var tableInfos = this.Context.DbMaintenance.GetTableInfoList(false); diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs index 2cacfbf0e..9353dafd0 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs @@ -288,6 +288,10 @@ namespace SqlSugar { return this.Context.QueryableByObject(entityType); } + public QueryMethodInfo QueryableByObject(Type entityType,string shortName) + { + return this.Context.QueryableByObject(entityType,shortName); + } public ISugarQueryable MasterQueryable() { return this.Context.MasterQueryable(); diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs index a64e5ce8e..9bbdd6922 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs @@ -876,5 +876,9 @@ namespace SqlSugar { return ScopedContext.QueryableByObject(entityType); } + public QueryMethodInfo QueryableByObject(Type entityType, string shortName) + { + return ScopedContext.QueryableByObject(entityType, shortName); + } } } diff --git a/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs b/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs index 3fef49288..d18f47dc1 100644 --- a/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs +++ b/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs @@ -47,6 +47,15 @@ namespace SqlSugar it.GetParameters()[1].ParameterType == parameterType2&& it.GetParameters()[2].ParameterType == parameterType3); } + public static MethodInfo GetMyMethod(this Type type, string name, int argCount, Type parameterType, Type parameterType2, Type parameterType3,Type parameterType4) + { + return type.GetMethods().Where(it => it.Name == name).FirstOrDefault(it => + it.GetParameters().Length == argCount && + it.GetParameters().First().ParameterType == parameterType && + it.GetParameters()[1].ParameterType == parameterType2 && + it.GetParameters()[2].ParameterType == parameterType3&& + it.GetParameters()[3].ParameterType == parameterType4); + } public static List ToList(this T thisValue,Func action) where T:class,new() { return new List { thisValue };