Add Queryable.ToParentList

This commit is contained in:
skx
2021-02-20 11:34:57 +08:00
parent fb1235858f
commit c5ffc1cea8
2 changed files with 60 additions and 9 deletions

View File

@@ -120,7 +120,7 @@ namespace SqlSugar
{ {
CallContext.MapperExpression.Value = new List<MapperExpression>(); CallContext.MapperExpression.Value = new List<MapperExpression>();
} }
CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToOne, FillExpression = mapperObject, MappingField1Expression = mainField, MappingField2Expression=childField, Context = this.Context }); CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToOne, FillExpression = mapperObject, MappingField1Expression = mainField, MappingField2Expression = childField, Context = this.Context });
return _Mapper<TObject>(mapperObject, mainField, childField); return _Mapper<TObject>(mapperObject, mainField, childField);
} }
public ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, List<TObject>>> mapperObject, Expression<Func<T, object>> mainField, Expression<Func<T, object>> childField) public ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, List<TObject>>> mapperObject, Expression<Func<T, object>> mainField, Expression<Func<T, object>> childField)
@@ -134,7 +134,7 @@ namespace SqlSugar
{ {
CallContext.MapperExpression.Value = new List<MapperExpression>(); CallContext.MapperExpression.Value = new List<MapperExpression>();
} }
CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToN, FillExpression = mapperObject, MappingField1Expression = mapperField,Context = this.Context }); CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToN, FillExpression = mapperObject, MappingField1Expression = mapperField, Context = this.Context });
return _Mapper<TObject>(mapperObject, mapperField); return _Mapper<TObject>(mapperObject, mapperField);
} }
public virtual ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, TObject>> mapperObject, Expression<Func<T, object>> mapperField) public virtual ISugarQueryable<T> Mapper<TObject>(Expression<Func<T, TObject>> mapperObject, Expression<Func<T, object>> mapperField)
@@ -143,7 +143,7 @@ namespace SqlSugar
{ {
CallContext.MapperExpression.Value = new List<MapperExpression>(); CallContext.MapperExpression.Value = new List<MapperExpression>();
} }
CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder= SqlBuilder, QueryBuilder = this.QueryBuilder, Type=MapperExpressionType.oneToOne, FillExpression=mapperObject, MappingField1Expression= mapperField,Context=this.Context }); CallContext.MapperExpression.Value.Add(new MapperExpression() { SqlBuilder = SqlBuilder, QueryBuilder = this.QueryBuilder, Type = MapperExpressionType.oneToOne, FillExpression = mapperObject, MappingField1Expression = mapperField, Context = this.Context });
return _Mapper<TObject>(mapperObject, mapperField); return _Mapper<TObject>(mapperObject, mapperField);
} }
@@ -680,8 +680,8 @@ namespace SqlSugar
Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(), "MergeTable need to use Queryable.Select Method ."); Check.Exception(this.QueryBuilder.SelectValue.IsNullOrEmpty(), "MergeTable need to use Queryable.Select Method .");
Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(), "MergeTable Queryable cannot Take Skip OrderBy PageToList "); Check.Exception(this.QueryBuilder.Skip > 0 || this.QueryBuilder.Take > 0 || this.QueryBuilder.OrderByValue.HasValue(), "MergeTable Queryable cannot Take Skip OrderBy PageToList ");
var sqlobj = this.ToSql(); var sqlobj = this.ToSql();
var index = QueryBuilder.WhereIndex+1; var index = QueryBuilder.WhereIndex + 1;
var result= this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null); var result = this.Context.Queryable<T>().AS(SqlBuilder.GetPackTable(sqlobj.Key, "MergeTable")).AddParameters(sqlobj.Value).Select("*").With(SqlWith.Null);
result.QueryBuilder.WhereIndex = index; result.QueryBuilder.WhereIndex = index;
result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++; result.QueryBuilder.LambdaExpressions.ParameterIndex = QueryBuilder.LambdaExpressions.ParameterIndex++;
result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++; result.QueryBuilder.LambdaExpressions.Index = QueryBuilder.LambdaExpressions.Index++;
@@ -778,7 +778,7 @@ namespace SqlSugar
var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService; var cacheService = this.Context.CurrentConnectionConfig.ConfigureExternalServices.DataInfoCacheService;
var result = CacheSchemeMain.GetOrCreate<string>(cacheService, this.QueryBuilder, () => var result = CacheSchemeMain.GetOrCreate<string>(cacheService, this.QueryBuilder, () =>
{ {
return this.Context.Utilities.SerializeObject(this.ToList(),typeof(T)); return this.Context.Utilities.SerializeObject(this.ToList(), typeof(T));
}, CacheTime, this.Context); }, CacheTime, this.Context);
return result; return result;
} }
@@ -795,6 +795,56 @@ namespace SqlSugar
{ {
return this.Context.Utilities.SerializeObject(this.ToPageList(pageIndex, pageSize, ref totalNumber), typeof(T)); return this.Context.Utilities.SerializeObject(this.ToPageList(pageIndex, pageSize, ref totalNumber), typeof(T));
} }
public List<T> ToParentList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue)
{
List<T> result = new List<T>() { };
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key");
var parentIdName = (parentIdExpression as MemberExpression).Member.Name;
var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName);
var parentPropertyName= ParentInfo.DbColumnName;
var current = this.Context.Queryable<T>().InSingle(primaryKeyValue);
if (current != null)
{
result.Add(current);
object parentId = ParentInfo.PropertyInfo.GetValue(current,null);
int i = 0;
while (parentId!=null&&this.Context.Queryable<T>().In(parentId).Any())
{
Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限100检查最顶层的ParentId是否是null或者0"));
var parent = this.Context.Queryable<T>().InSingle(parentId);
result.Add(parent);
parentId= ParentInfo.PropertyInfo.GetValue(parent, null);
++i;
}
}
return result;
}
public async Task<List<T>> ToParentListAsync(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue)
{
List<T> result = new List<T>() { };
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();
Check.Exception(entity.Columns.Where(it => it.IsPrimarykey).Count() == 0, "No Primary key");
var parentIdName = (parentIdExpression as MemberExpression).Member.Name;
var ParentInfo = entity.Columns.First(it => it.PropertyName == parentIdName);
var parentPropertyName = ParentInfo.DbColumnName;
var current =await this.Context.Queryable<T>().InSingleAsync(primaryKeyValue);
if (current != null)
{
result.Add(current);
object parentId = ParentInfo.PropertyInfo.GetValue(current, null);
int i = 0;
while (parentId != null &&await this.Context.Queryable<T>().In(parentId).AnyAsync())
{
Check.Exception(i > 100, ErrorMessage.GetThrowMessage("Dead cycle", "出现死循环或超出循环上限100检查最顶层的ParentId是否是null或者0"));
var parent =await this.Context.Queryable<T>().InSingleAsync(parentId);
result.Add(parent);
parentId = ParentInfo.PropertyInfo.GetValue(parent, null);
++i;
}
}
return result;
}
public List<T> ToTree(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue) public List<T> ToTree(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue)
{ {
var entity = this.Context.EntityMaintenance.GetEntityInfo<T>(); var entity = this.Context.EntityMaintenance.GetEntityInfo<T>();

View File

@@ -139,7 +139,8 @@ namespace SqlSugar
string ToJsonPage(int pageIndex, int pageSize, ref int totalNumber); string ToJsonPage(int pageIndex, int pageSize, ref int totalNumber);
Task<string> ToJsonPageAsync(int pageIndex, int pageSize, RefAsync<int> totalNumber); Task<string> ToJsonPageAsync(int pageIndex, int pageSize, RefAsync<int> totalNumber);
KeyValuePair<string, List<SugarParameter>> ToSql(); KeyValuePair<string, List<SugarParameter>> ToSql();
List<T> ToParentList(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue);
Task<List<T>> ToParentListAsync(Expression<Func<T, object>> parentIdExpression, object primaryKeyValue);
List<T> ToTree(Expression<Func<T,IEnumerable<object>>> childListExpression, Expression<Func<T,object>> parentIdExpression,object rootValue); List<T> ToTree(Expression<Func<T,IEnumerable<object>>> childListExpression, Expression<Func<T,object>> parentIdExpression,object rootValue);
Task<List<T>> ToTreeAsync(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue); Task<List<T>> ToTreeAsync(Expression<Func<T, IEnumerable<object>>> childListExpression, Expression<Func<T, object>> parentIdExpression, object rootValue);
DataTable ToDataTable(); DataTable ToDataTable();