mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-10-25 18:29:13 +08:00
Support Select interface
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -214,12 +215,18 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
return GetArrayList<T>(type, dataReader);
|
return GetArrayList<T>(type, dataReader);
|
||||||
}
|
}
|
||||||
|
else if (typeof(T)!=type&&typeof(T).IsInterface)
|
||||||
|
{
|
||||||
|
//这里是为了解决返回类型是接口的问题
|
||||||
|
return GetEntityListByType<T>(type, Context, dataReader);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return GetEntityList<T>(Context, dataReader);
|
return GetEntityList<T>(Context, dataReader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual async Task<List<T>> DataReaderToListAsync<T>(Type type, IDataReader dataReader)
|
public virtual async Task<List<T>> DataReaderToListAsync<T>(Type type, IDataReader dataReader)
|
||||||
{
|
{
|
||||||
using (dataReader)
|
using (dataReader)
|
||||||
@@ -236,6 +243,11 @@ namespace SqlSugar
|
|||||||
{
|
{
|
||||||
return await GetArrayListAsync<T>(type, dataReader);
|
return await GetArrayListAsync<T>(type, dataReader);
|
||||||
}
|
}
|
||||||
|
else if (typeof(T) != type && typeof(T).IsInterface)
|
||||||
|
{
|
||||||
|
//这里是为了解决返回类型是接口的问题
|
||||||
|
return await GetEntityListByTypeAsync<T>(type, Context, dataReader);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return await GetEntityListAsync<T>(Context, dataReader);
|
return await GetEntityListAsync<T>(Context, dataReader);
|
||||||
@@ -280,6 +292,37 @@ namespace SqlSugar
|
|||||||
return GetEntityListAsync<T>(Context, dataReader);
|
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
|
#endregion
|
||||||
|
|
||||||
#region Throw rule
|
#region Throw rule
|
||||||
|
|||||||
@@ -1889,7 +1889,14 @@ namespace SqlSugar
|
|||||||
SugarParameter[] parameters = sqlObj.Value.ToArray();
|
SugarParameter[] parameters = sqlObj.Value.ToArray();
|
||||||
var dataReader = this.Db.GetDataReader(sqlString, parameters);
|
var dataReader = this.Db.GetDataReader(sqlString, parameters);
|
||||||
this.Db.GetDataBefore(sqlString, parameters);
|
this.Db.GetDataBefore(sqlString, parameters);
|
||||||
|
if (entityType.IsInterface)
|
||||||
|
{
|
||||||
|
result = GetData<TResult>(isComplexModel, this.QueryBuilder.AsType, dataReader);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
result = GetData<TResult>(isComplexModel, entityType, dataReader);
|
result = GetData<TResult>(isComplexModel, entityType, dataReader);
|
||||||
|
}
|
||||||
this.Db.GetDataAfter(sqlString, parameters);
|
this.Db.GetDataAfter(sqlString, parameters);
|
||||||
RestChangeMasterQuery(isChangeQueryableMasterSlave);
|
RestChangeMasterQuery(isChangeQueryableMasterSlave);
|
||||||
RestChangeSlaveQuery(isChangeQueryableSlave);
|
RestChangeSlaveQuery(isChangeQueryableSlave);
|
||||||
@@ -1906,7 +1913,14 @@ namespace SqlSugar
|
|||||||
SugarParameter[] parameters = sqlObj.Value.ToArray();
|
SugarParameter[] parameters = sqlObj.Value.ToArray();
|
||||||
var dataReader = await this.Db.GetDataReaderAsync(sqlString, parameters);
|
var dataReader = await this.Db.GetDataReaderAsync(sqlString, parameters);
|
||||||
this.Db.GetDataBefore(sqlString, parameters);
|
this.Db.GetDataBefore(sqlString, parameters);
|
||||||
|
if (entityType.IsInterface)
|
||||||
|
{
|
||||||
|
result =await GetDataAsync<TResult>(isComplexModel, this.QueryBuilder.AsType, dataReader);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
result = await GetDataAsync<TResult>(isComplexModel, entityType, dataReader);
|
result = await GetDataAsync<TResult>(isComplexModel, entityType, dataReader);
|
||||||
|
}
|
||||||
this.Db.GetDataAfter(sqlString, parameters);
|
this.Db.GetDataAfter(sqlString, parameters);
|
||||||
RestChangeMasterQuery(isChangeQueryableMasterSlave);
|
RestChangeMasterQuery(isChangeQueryableMasterSlave);
|
||||||
RestChangeSlaveQuery(isChangeQueryableSlave);
|
RestChangeSlaveQuery(isChangeQueryableSlave);
|
||||||
@@ -2110,6 +2124,7 @@ namespace SqlSugar
|
|||||||
asyncQueryableBuilder.JoinExpression = this.QueryBuilder.JoinExpression;
|
asyncQueryableBuilder.JoinExpression = this.QueryBuilder.JoinExpression;
|
||||||
asyncQueryableBuilder.WhereIndex = this.QueryBuilder.WhereIndex;
|
asyncQueryableBuilder.WhereIndex = this.QueryBuilder.WhereIndex;
|
||||||
asyncQueryableBuilder.HavingInfos = this.QueryBuilder.HavingInfos;
|
asyncQueryableBuilder.HavingInfos = this.QueryBuilder.HavingInfos;
|
||||||
|
asyncQueryableBuilder.AsType = this.QueryBuilder.AsType;
|
||||||
asyncQueryableBuilder.LambdaExpressions.ParameterIndex = this.QueryBuilder.LambdaExpressions.ParameterIndex;
|
asyncQueryableBuilder.LambdaExpressions.ParameterIndex = this.QueryBuilder.LambdaExpressions.ParameterIndex;
|
||||||
asyncQueryableBuilder.IgnoreColumns = this.Context.Utilities.TranslateCopy(this.QueryBuilder.IgnoreColumns);
|
asyncQueryableBuilder.IgnoreColumns = this.Context.Utilities.TranslateCopy(this.QueryBuilder.IgnoreColumns);
|
||||||
asyncQueryableBuilder.AsTables = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AsTables);
|
asyncQueryableBuilder.AsTables = this.Context.Utilities.TranslateCopy(this.QueryBuilder.AsTables);
|
||||||
|
|||||||
@@ -361,6 +361,7 @@ namespace SqlSugar
|
|||||||
}
|
}
|
||||||
public ISugarQueryable<T> AsType(Type tableNameType)
|
public ISugarQueryable<T> AsType(Type tableNameType)
|
||||||
{
|
{
|
||||||
|
this.QueryBuilder.AsType = tableNameType;
|
||||||
return AS(this.Context.EntityMaintenance.GetEntityInfo(tableNameType).DbTableName);
|
return AS(this.Context.EntityMaintenance.GetEntityInfo(tableNameType).DbTableName);
|
||||||
}
|
}
|
||||||
public virtual ISugarQueryable<T> With(string withString)
|
public virtual ISugarQueryable<T> With(string withString)
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ namespace SqlSugar
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Splicing basic
|
#region Splicing basic
|
||||||
|
public Type AsType { get; set; }
|
||||||
public bool IsParameterizedConstructor { get; set; }
|
public bool IsParameterizedConstructor { get; set; }
|
||||||
public string Hints { get; set; }
|
public string Hints { get; set; }
|
||||||
internal AppendNavInfo AppendNavInfo { get; set; }
|
internal AppendNavInfo AppendNavInfo { get; set; }
|
||||||
|
|||||||
Reference in New Issue
Block a user