diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteMethodInfo.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteMethodInfo.cs new file mode 100644 index 000000000..8c55124f6 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteMethodInfo.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace SqlSugar +{ + public class DeleteMethodInfo + { + internal SqlSugarProvider Context { get; set; } + internal MethodInfo MethodInfo { get; set; } + internal object objectValue { get; set; } + + public int ExecuteCommand() + { + if (Context == null) return 0; + var inertable=MethodInfo.Invoke(Context, new object[] { objectValue }); + var result= inertable.GetType().GetMethod("ExecuteCommand").Invoke(inertable,new object[] { }); + return (int)result; + } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs index c91f15b58..3477030db 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarAccessory.cs @@ -422,7 +422,6 @@ namespace SqlSugar InstanceFactory.CustomDllName = SugarCompatible.IsFramework ? "SqlSugar.GBase" : "SqlSugar.GBaseCore"; break; case DbType.Odbc: - Check.Exception(SugarCompatible.IsFramework, "Odbc only support .net core"); InstanceFactory.CustomDllName = SugarCompatible.IsFramework ? "SqlSugar.Odbc" : "SqlSugar.OdbcCore"; break; default: diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index f8882e7bf..4576c9d7f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -767,6 +767,52 @@ namespace SqlSugar #endregion #region Deleteable + public DeleteMethodInfo DeleteableByObject(object singleEntityObjectOrListObject) + { + if (singleEntityObjectOrListObject == null) + return new DeleteMethodInfo(); + if (singleEntityObjectOrListObject.GetType().FullName.IsCollectionsList()) + { + var list = ((IList)singleEntityObjectOrListObject); + if (list == null || list.Count == 0) + return new DeleteMethodInfo(); + var type = list[0].GetType(); + var newList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type)); + foreach (var item in list) + { + newList.Add(item); + } + var methods = this.Context.GetType().GetMethods() + .Where(it => it.Name == "Deleteable") + .Where(it => it.GetGenericArguments().Any()) + .Where(it => it.GetParameters().Any(z => z.ParameterType.Name.StartsWith("List"))) + .Where(it => it.Name == "Deleteable").ToList(); + var method = methods.Single().MakeGenericMethod(newList.GetType().GetGenericArguments().FirstOrDefault()); + DeleteMethodInfo result = new DeleteMethodInfo() + { + Context = this.Context, + MethodInfo = method, + objectValue = newList + }; + return result; + } + else + { + var methods = this.Context.GetType().GetMethods() + .Where(it => it.Name == "Deleteable") + .Where(it => it.GetGenericArguments().Any()) + .Where(it => it.GetParameters().Any(z => z.ParameterType.Name == "T")) + .Where(it => it.Name == "Deleteable").ToList(); + var method = methods.Single().MakeGenericMethod(singleEntityObjectOrListObject.GetType()); + DeleteMethodInfo result = new DeleteMethodInfo() + { + Context = this.Context, + MethodInfo = method, + objectValue = singleEntityObjectOrListObject + }; + return result; + } + } public virtual IDeleteable Deleteable() where T : class, new() { InitMappingInfo(); @@ -806,6 +852,52 @@ namespace SqlSugar #endregion #region Updateable + public UpdateMethodInfo UpdateableByObject(object singleEntityObjectOrListObject) + { + if (singleEntityObjectOrListObject == null) + return new UpdateMethodInfo(); + if (singleEntityObjectOrListObject.GetType().FullName.IsCollectionsList()) + { + var list = ((IList)singleEntityObjectOrListObject); + if (list == null || list.Count == 0) + return new UpdateMethodInfo(); + var type = list[0].GetType(); + var newList = (IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(type)); + foreach (var item in list) + { + newList.Add(item); + } + var methods = this.Context.GetType().GetMethods() + .Where(it => it.Name == "Updateable") + .Where(it => it.GetGenericArguments().Any()) + .Where(it => it.GetParameters().Any(z => z.ParameterType.Name.StartsWith("List"))) + .Where(it => it.Name == "Updateable").ToList(); + var method = methods.Single().MakeGenericMethod(newList.GetType().GetGenericArguments().First()); + UpdateMethodInfo result = new UpdateMethodInfo() + { + Context = this.Context, + MethodInfo = method, + objectValue = newList + }; + return result; + } + else + { + var methods = this.Context.GetType().GetMethods() + .Where(it => it.Name == "Updateable") + .Where(it => it.GetGenericArguments().Any()) + .Where(it => it.GetParameters().Any(z => z.ParameterType.Name == "T")) + .Where(it => it.Name == "Updateable").ToList(); + var method = methods.Single().MakeGenericMethod(singleEntityObjectOrListObject.GetType()); + UpdateMethodInfo result = new UpdateMethodInfo() + { + Context = this.Context, + MethodInfo = method, + objectValue = singleEntityObjectOrListObject + }; + return result; + } + } public virtual IUpdateable Updateable(T[] UpdateObjs) where T : class, new() { InitMappingInfo(); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs index 08af0e1ca..5f612e8f4 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs @@ -144,6 +144,10 @@ namespace SqlSugar { ScopedContext.Close(); } + public DeleteMethodInfo DeleteableByObject(object singleEntityObjectOrListObject) + { + return ScopedContext.DeleteableByObject(singleEntityObjectOrListObject); + } public IDeleteable Deleteable() where T : class, new() { return ScopedContext.Deleteable(); @@ -615,6 +619,10 @@ namespace SqlSugar { return ScopedContext.UnionAll(queryables); } + public UpdateMethodInfo UpdateableByObject(object singleEntityObjectOrListObject) + { + return ScopedContext.UpdateableByObject(singleEntityObjectOrListObject); + } public IUpdateable Updateable() where T : class, new() { diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateMethodInfo.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateMethodInfo.cs new file mode 100644 index 000000000..74e0f095c --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/UpdateMethodInfo.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace SqlSugar +{ + public class UpdateMethodInfo + { + internal SqlSugarProvider Context { get; set; } + internal MethodInfo MethodInfo { get; set; } + internal object objectValue { get; set; } + + public int ExecuteCommand() + { + if (Context == null) return 0; + var inertable=MethodInfo.Invoke(Context, new object[] { objectValue }); + var result= inertable.GetType().GetMethod("ExecuteCommand").Invoke(inertable,new object[] { }); + return (int)result; + } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs index 78be4ce86..e8cbc14d4 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs @@ -181,6 +181,10 @@ namespace SqlSugar public IInsertable Insertable(T insertObj) where T : class, new() { Check.Exception(typeof(T).FullName.Contains("System.Collections.Generic.List`"), " need where T: class, new() "); + if (typeof(T).Name == "Object") + { + Check.ExceptionEasy("Object type use db.InsertableByObject(obj).ExecuteCommand()", "检测到T为Object类型,请使用 db.InsertableByObject(obj).ExecuteCommand(),Insertable不支持object,InsertableByObject可以(缺点:功能比较少)"); + } return this.Context.Insertable(insertObj); } @@ -661,6 +665,10 @@ namespace SqlSugar #endregion #region Updateable + public UpdateMethodInfo UpdateableByObject(object singleEntityObjectOrListObject) + { + return this.Context.UpdateableByObject(singleEntityObjectOrListObject); + } public IUpdateable Updateable() where T : class, new() { return this.Context.Updateable(); @@ -709,6 +717,10 @@ namespace SqlSugar #endregion #region Deleteable + public DeleteMethodInfo DeleteableByObject(object singleEntityObjectOrListObject) + { + return this.Context.DeleteableByObject(singleEntityObjectOrListObject); + } public IDeleteable Deleteable() where T : class, new() { return this.Context.Deleteable(); diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs index 7d397bc19..e4ec34a06 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs @@ -120,6 +120,10 @@ namespace SqlSugar { return ScopedContext.CommitTranAsync(); } + public DeleteMethodInfo DeleteableByObject(object singleEntityObjectOrListObject) + { + return ScopedContext.DeleteableByObject(singleEntityObjectOrListObject); + } public IDeleteable Deleteable() where T : class, new() { return ScopedContext.Deleteable(); @@ -626,7 +630,10 @@ namespace SqlSugar { return ScopedContext.UnionAll(queryables); } - + public UpdateMethodInfo UpdateableByObject(object singleEntityObjectOrListObject) + { + return ScopedContext.UpdateableByObject(singleEntityObjectOrListObject); + } public IUpdateable Updateable() where T : class, new() { return ScopedContext.Updateable();