Support Select interface

This commit is contained in:
sunkaixuan 2025-01-17 16:48:54 +08:00
parent 7289ca6dae
commit 62a7efd4b3
4 changed files with 63 additions and 3 deletions

View File

@ -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<T>(type, dataReader);
}
else if (typeof(T)!=type&&typeof(T).IsInterface)
{
//这里是为了解决返回类型是接口的问题
return GetEntityListByType<T>(type, Context, dataReader);
}
else
{
return GetEntityList<T>(Context, dataReader);
}
}
}
public virtual async Task<List<T>> DataReaderToListAsync<T>(Type type, IDataReader dataReader)
{
using (dataReader)
@ -236,6 +243,11 @@ namespace SqlSugar
{
return await GetArrayListAsync<T>(type, dataReader);
}
else if (typeof(T) != type && typeof(T).IsInterface)
{
//这里是为了解决返回类型是接口的问题
return await GetEntityListByTypeAsync<T>(type, Context, dataReader);
}
else
{
return await GetEntityListAsync<T>(Context, dataReader);
@ -280,6 +292,37 @@ namespace SqlSugar
return GetEntityListAsync<T>(Context, dataReader);
}
}
public virtual List<T> GetEntityListByType<T>(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<T> result = new List<T>();
foreach (var item in objectValue as IEnumerable)
{
result.Add((T)item);
}
return result;
}
public virtual async Task<List<T>> GetEntityListByTypeAsync<T>(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<T>(task);
}
private static async Task<List<T>> GetTask<T>(Task task)
{
await task.ConfigureAwait(false); // 等待任务完成
var resultProperty = task.GetType().GetProperty("Result");
var value = resultProperty.GetValue(task);
List<T> result = new List<T>();
foreach (var item in value as IEnumerable)
{
result.Add((T)item);
}
return (List<T>)result;
}
#endregion
#region Throw rule

View File

@ -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<TResult>(isComplexModel, entityType, dataReader);
if (entityType.IsInterface)
{
result = GetData<TResult>(isComplexModel, this.QueryBuilder.AsType, dataReader);
}
else
{
result = GetData<TResult>(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<TResult>(isComplexModel, entityType, dataReader);
if (entityType.IsInterface)
{
result =await GetDataAsync<TResult>(isComplexModel, this.QueryBuilder.AsType, dataReader);
}
else
{
result = await GetDataAsync<TResult>(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);

View File

@ -361,6 +361,7 @@ namespace SqlSugar
}
public ISugarQueryable<T> AsType(Type tableNameType)
{
this.QueryBuilder.AsType = tableNameType;
return AS(this.Context.EntityMaintenance.GetEntityInfo(tableNameType).DbTableName);
}
public virtual ISugarQueryable<T> With(string withString)

View File

@ -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; }