diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs new file mode 100644 index 000000000..fcb157917 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Linq; +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 QueryMethodInfo Where(string sql, object parameters) + { + var method = QueryableObj.GetType().GetMyMethod("Where", 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}); + return this; + } + 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 }); + return this; + } + public QueryMethodInfo SplitTable() + { + var method = QueryableObj.GetType().GetMyMethod("SplitTable", 0); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { }); + 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; + } + + #region Result + public object ToPageList(int pageNumber, int pageSize) + { + var method = QueryableObj.GetType().GetMyMethod("ToPageList", 2, typeof(int), typeof(int)); + var reslt = method.Invoke(QueryableObj, new object[] { pageNumber, pageSize }); + return reslt; + } + public object ToPageList(int pageNumber, int pageSize, ref int count) + { + var method = QueryableObj.GetType().GetMyMethod("ToPageList", 3, typeof(int), typeof(int), typeof(int).MakeByRefType()); + var parameters = new object[] { pageNumber, pageSize, count }; + var reslt = method.Invoke(QueryableObj, parameters); + count = parameters.Last().ObjToInt(); + return reslt; + } + public object ToList() + { + var method = QueryableObj.GetType().GetMyMethod("ToList", 0); + var reslt = method.Invoke(QueryableObj, new object[] { }); + return reslt; + } + public object First() + { + var method = QueryableObj.GetType().GetMyMethod("First", 0); + var reslt = method.Invoke(QueryableObj, new object[] { }); + return reslt; + } + public object Any() + { + var method = QueryableObj.GetType().GetMyMethod("Any", 0); + var reslt = method.Invoke(QueryableObj, new object[] { }); + return reslt; + } + #endregion + + #region Result Async + public async Task ToPageListAsync(int pageNumber, int pageSize) + { + var method = QueryableObj.GetType().GetMyMethod("ToPageListAsync", 2, typeof(int), typeof(int)); + Task task = (Task)method.Invoke(QueryableObj, new object[] { pageNumber, pageSize }); + return await GetTask(task).ConfigureAwait(false); + } + public async Task ToPageListAsync(int pageNumber, int pageSize, RefAsync count) + { + var method = QueryableObj.GetType().GetMyMethod("ToPageListAsync", 3, typeof(int), typeof(int),typeof( RefAsync)); + var parameters = new object[] { pageNumber, pageSize, count }; + var task = (Task)method.Invoke(QueryableObj, parameters); + return await GetTask(task).ConfigureAwait(false); + } + public async Task ToListAsync() + { + var method = QueryableObj.GetType().GetMyMethod("ToListAsync", 0); + var task = (Task)method.Invoke(QueryableObj, new object[] { }); + return await GetTask(task).ConfigureAwait(false); + } + public async Task FirstAsync() + { + var method = QueryableObj.GetType().GetMyMethod("FirstAsync", 0); + var task = (Task)method.Invoke(QueryableObj, new object[] { }); + return await GetTask(task).ConfigureAwait(false); + } + public async Task AnyAsync() + { + var method = QueryableObj.GetType().GetMyMethod("AnyAsync", 0); + var reslt = method.Invoke(QueryableObj, new object[] { }); + return await (Task) reslt; + } + #endregion + + #region Helper + private static async Task GetTask(Task task) + { + await task.ConfigureAwait(false); // 等待任务完成 + var resultProperty = task.GetType().GetProperty("Result"); + var result = resultProperty.GetValue(task); + return result; + } + #endregion + } +} diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index 47f1c1a03..1ff133957 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -82,6 +82,16 @@ namespace SqlSugar #endregion #region Queryable + public QueryMethodInfo QueryableByObject(Type entityType) + { + QueryMethodInfo result = new QueryMethodInfo(); + var method=this.GetType().GetMyMethod("Queryable", 0); + var methodT=method.MakeGenericMethod(entityType); + var queryableObj=methodT.Invoke(this,new object[] {}); + result.QueryableObj = queryableObj; + result.Context = this.Context; + return result; + } /// /// Get datebase time /// diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs index 3a006fbe6..e316e3f05 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs @@ -815,6 +815,10 @@ namespace SqlSugar { ScopedContext.Tracking(datas); } + public QueryMethodInfo QueryableByObject(Type entityType) + { + return ScopedContext.QueryableByObject(entityType); + } #endregion } } \ No newline at end of file diff --git a/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/Interface/ISqlSugarClient.cs index a7128df6d..1ba7cbb1c 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); ISugarQueryable MasterQueryable(); ISugarQueryable SlaveQueryable(); ISugarQueryable SqlQueryable(string sql) where T : class, new(); diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs index 237259c36..2cacfbf0e 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarClient.cs @@ -284,6 +284,10 @@ namespace SqlSugar } #endregion + public QueryMethodInfo QueryableByObject(Type entityType) + { + return this.Context.QueryableByObject(entityType); + } public ISugarQueryable MasterQueryable() { return this.Context.MasterQueryable(); diff --git a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs index 1a6577810..a64e5ce8e 100644 --- a/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.NetCore2/SqlSugar/SqlSugarScope.cs @@ -872,5 +872,9 @@ namespace SqlSugar { return ScopedContext.AsyncLock(timeOutSeconds); } + public QueryMethodInfo QueryableByObject(Type entityType) + { + return ScopedContext.QueryableByObject(entityType); + } } } diff --git a/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs b/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs index 4ffde70b3..3fef49288 100644 --- a/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs +++ b/Src/Asp.NetCore2/SqlSugar/Utilities/CommonExtensions.cs @@ -32,6 +32,21 @@ namespace SqlSugar it.GetParameters().Length == argCount&& it.GetParameters().First().ParameterType==parameterType); } + public static MethodInfo GetMyMethod(this Type type, string name, int argCount, Type parameterType,Type parameterType2) + { + return type.GetMethods().Where(it=>it.Name == name).FirstOrDefault(it => + it.GetParameters().Length == argCount && + it.GetParameters().First().ParameterType == parameterType&& + it.GetParameters()[1].ParameterType == parameterType2) ; + } + public static MethodInfo GetMyMethod(this Type type, string name, int argCount, Type parameterType, Type parameterType2, Type parameterType3) + { + 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); + } public static List ToList(this T thisValue,Func action) where T:class,new() { return new List { thisValue };