From 62a7efd4b3db7dc948eefd72a81444b52dac251d Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Fri, 17 Jan 2025 16:48:54 +0800 Subject: [PATCH] Support Select interface --- .../Abstract/DbBindProvider/DbBindProvider.cs | 43 +++++++++++++++++++ .../QueryableProvider/QueryableHelper.cs | 19 +++++++- .../QueryableProvider/QueryableProvider.cs | 1 + .../SqlBuilderProvider/QueryBuilder.cs | 3 +- 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs index 4a349e9f1..a97d5c0ca 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; @@ -214,12 +215,18 @@ namespace SqlSugar { return GetArrayList(type, dataReader); } + else if (typeof(T)!=type&&typeof(T).IsInterface) + { + //这里是为了解决返回类型是接口的问题 + return GetEntityListByType(type, Context, dataReader); + } else { return GetEntityList(Context, dataReader); } } } + public virtual async Task> DataReaderToListAsync(Type type, IDataReader dataReader) { using (dataReader) @@ -236,6 +243,11 @@ namespace SqlSugar { return await GetArrayListAsync(type, dataReader); } + else if (typeof(T) != type && typeof(T).IsInterface) + { + //这里是为了解决返回类型是接口的问题 + return await GetEntityListByTypeAsync(type, Context, dataReader); + } else { return await GetEntityListAsync(Context, dataReader); @@ -280,6 +292,37 @@ namespace SqlSugar return GetEntityListAsync(Context, dataReader); } } + public virtual List GetEntityListByType(Type entityType, SqlSugarProvider context, IDataReader dataReader) + { + var method = typeof(DbBindProvider).GetMethod("GetEntityList", BindingFlags.Instance | BindingFlags.NonPublic); + var genericMethod = method.MakeGenericMethod(entityType); + var objectValue= genericMethod.Invoke(this, new object[] { context, dataReader }); + List result = new List(); + foreach (var item in objectValue as IEnumerable) + { + result.Add((T)item); + } + return result; + } + public virtual async Task> GetEntityListByTypeAsync(Type entityType, SqlSugarProvider context, IDataReader dataReader) + { + var method = typeof(DbBindProvider).GetMethod("GetEntityListAsync", BindingFlags.Instance | BindingFlags.NonPublic); + var genericMethod = method.MakeGenericMethod(entityType); + Task task = (Task)genericMethod.Invoke(this, new object[] { context, dataReader }); + return await GetTask(task); + } + private static async Task> GetTask(Task task) + { + await task.ConfigureAwait(false); // 等待任务完成 + var resultProperty = task.GetType().GetProperty("Result"); + var value = resultProperty.GetValue(task); + List result = new List(); + foreach (var item in value as IEnumerable) + { + result.Add((T)item); + } + return (List)result; + } #endregion #region Throw rule diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index 05dcdab7e..7a169d9fc 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -1889,7 +1889,14 @@ namespace SqlSugar SugarParameter[] parameters = sqlObj.Value.ToArray(); var dataReader = this.Db.GetDataReader(sqlString, parameters); this.Db.GetDataBefore(sqlString, parameters); - result = GetData(isComplexModel, entityType, dataReader); + if (entityType.IsInterface) + { + result = GetData(isComplexModel, this.QueryBuilder.AsType, dataReader); + } + else + { + result = GetData(isComplexModel, entityType, dataReader); + } this.Db.GetDataAfter(sqlString, parameters); RestChangeMasterQuery(isChangeQueryableMasterSlave); RestChangeSlaveQuery(isChangeQueryableSlave); @@ -1906,7 +1913,14 @@ namespace SqlSugar SugarParameter[] parameters = sqlObj.Value.ToArray(); var dataReader = await this.Db.GetDataReaderAsync(sqlString, parameters); this.Db.GetDataBefore(sqlString, parameters); - result = await GetDataAsync(isComplexModel, entityType, dataReader); + if (entityType.IsInterface) + { + result =await GetDataAsync(isComplexModel, this.QueryBuilder.AsType, dataReader); + } + else + { + result = await GetDataAsync(isComplexModel, entityType, dataReader); + } this.Db.GetDataAfter(sqlString, parameters); RestChangeMasterQuery(isChangeQueryableMasterSlave); RestChangeSlaveQuery(isChangeQueryableSlave); @@ -2110,6 +2124,7 @@ namespace SqlSugar asyncQueryableBuilder.JoinExpression = this.QueryBuilder.JoinExpression; asyncQueryableBuilder.WhereIndex = this.QueryBuilder.WhereIndex; asyncQueryableBuilder.HavingInfos = this.QueryBuilder.HavingInfos; + asyncQueryableBuilder.AsType = this.QueryBuilder.AsType; asyncQueryableBuilder.LambdaExpressions.ParameterIndex = this.QueryBuilder.LambdaExpressions.ParameterIndex; asyncQueryableBuilder.IgnoreColumns = this.Context.Utilities.TranslateCopy(this.QueryBuilder.IgnoreColumns); asyncQueryableBuilder.AsTables = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AsTables); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index fc261f885..2f6eaf5a5 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -361,6 +361,7 @@ namespace SqlSugar } public ISugarQueryable AsType(Type tableNameType) { + this.QueryBuilder.AsType = tableNameType; return AS(this.Context.EntityMaintenance.GetEntityInfo(tableNameType).DbTableName); } public virtual ISugarQueryable With(string withString) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index f49cc18f2..38e033ae0 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -33,7 +33,8 @@ namespace SqlSugar public ISqlBuilder Builder { get; set; } #endregion - #region Splicing basic + #region Splicing basic + public Type AsType { get; set; } public bool IsParameterizedConstructor { get; set; } public string Hints { get; set; } internal AppendNavInfo AppendNavInfo { get; set; }