mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-04-05 17:37:58 +08:00
Support Select interface
This commit is contained in:
parent
7289ca6dae
commit
62a7efd4b3
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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; }
|
||||
|
Loading…
Reference in New Issue
Block a user