Update nav query

This commit is contained in:
sunkaixuan
2022-07-15 19:45:24 +08:00
parent 9f273bcc50
commit 2a79b93c27
5 changed files with 205 additions and 31 deletions

View File

@@ -13,7 +13,8 @@ namespace SqlSugar
{ {
List<TResult> result = new List <TResult>(); List<TResult> result = new List <TResult>();
var isSqlFunc = IsSqlFunc(expression, queryableProvider); var isSqlFunc = IsSqlFunc(expression, queryableProvider);
if (isSqlFunc&&isGroup(expression, queryableProvider)) var isClass = IsClass(expression, queryableProvider);
if (isSqlFunc && isGroup(expression, queryableProvider))
{ {
var sqlfuncQueryable = queryableProvider.Clone(); var sqlfuncQueryable = queryableProvider.Clone();
sqlfuncQueryable.QueryBuilder.Includes = null; sqlfuncQueryable.QueryBuilder.Includes = null;
@@ -21,26 +22,81 @@ namespace SqlSugar
.Select(expression) .Select(expression)
.ToList(); .ToList();
var includeQueryable = queryableProvider.Clone(); var includeQueryable = queryableProvider.Clone();
includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context,queryableProvider.QueryBuilder)); includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context, queryableProvider.QueryBuilder));
includeQueryable.QueryBuilder.NoCheckInclude=true; includeQueryable.QueryBuilder.NoCheckInclude = true;
MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context); MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context);
} }
else if (isSqlFunc) else if (isSqlFunc)
{ {
var sqlfuncQueryable = queryableProvider.Clone(); result = SqlFunc(expression, queryableProvider);
sqlfuncQueryable.QueryBuilder.Includes = null; }
result = sqlfuncQueryable else if (typeof(TResult).IsAnonymousType() && isClass == false)
.Select(expression) {
.ToList(); result = SqlFunc(expression, queryableProvider);
var includeList = queryableProvider.Clone().ToList(); }
MegerList(result, includeList, sqlfuncQueryable.Context); else if (typeof(TResult).IsAnonymousType() && isClass == true)
{
result = Action(expression, queryableProvider);
} }
else else
{ {
result= queryableProvider.ToList().Select(expression.Compile()).ToList(); try
{
result = SqlFunc(expression, queryableProvider);
}
catch (Exception ex)
{
try
{
result = Action(expression, queryableProvider);
}
catch
{
throw ex;
}
}
} }
return result; return result;
} }
private static List<TResult> Action<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
List<TResult> result;
var entity = queryableProvider.Context.EntityMaintenance.GetEntityInfo<TResult>();
var list = queryableProvider.Clone().ToList();
var dt=queryableProvider.Context.Utilities.ListToDataTable(list);
foreach (System.Data.DataRow item in dt.Rows)
{
foreach (System.Data.DataColumn columnInfo in dt.Columns)
{
if (columnInfo.DataType.IsClass())
{
if (item[columnInfo.ColumnName] == null || item[columnInfo.ColumnName] == DBNull.Value)
{
item[columnInfo.ColumnName] = Activator.CreateInstance(columnInfo.DataType, true);
}
}
}
}
list = queryableProvider.Context.Utilities.DataTableToList<T>(dt);
result = list.Select(expression.Compile()).ToList();
return result;
}
private static List<TResult> SqlFunc<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
List<TResult> result;
var sqlfuncQueryable = queryableProvider.Clone();
sqlfuncQueryable.QueryBuilder.Includes = null;
result = sqlfuncQueryable
.Select(expression)
.ToList();
var includeList = queryableProvider.Clone().ToList();
MegerList(result, includeList, sqlfuncQueryable.Context);
return result;
}
internal static async Task<List<TResult>> GetListAsync<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider) internal static async Task<List<TResult>> GetListAsync<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{ {
List<TResult> result = new List<TResult>(); List<TResult> result = new List<TResult>();
@@ -121,6 +177,26 @@ namespace SqlSugar
i++; i++;
} }
} }
private static bool IsClass<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
var body = ExpressionTool.GetLambdaExpressionBody(expression);
if (body is NewExpression)
{
var newExp = ((NewExpression)body);
foreach (var item in newExp.Arguments)
{
if (item is MemberExpression)
{
var member = (MemberExpression)item;
if (member.Type.IsClass())
{
return true;
}
}
}
}
return false;
}
private static bool IsSqlFunc<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider) private static bool IsSqlFunc<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{ {

View File

@@ -1990,7 +1990,12 @@ namespace SqlSugar
{ {
if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0) if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0)
{ {
var list = this.ToPageList(pageIndex,pageSize,ref totalNumber).Select(expression.Compile()).ToList(); if (pageIndex == 0)
pageIndex = 1;
var list = this.Clone().Skip(pageIndex-1*pageSize).Take(pageSize).ToList(expression);
var countQueryable = this.Clone();
countQueryable.QueryBuilder.Includes = null;
totalNumber = countQueryable.Count();
return list; return list;
} }
else else
@@ -2272,8 +2277,12 @@ namespace SqlSugar
{ {
if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0) if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0)
{ {
var pList = await this.ToPageListAsync(pageIndex, pageSize, totalNumber); if (pageIndex == 0)
var list = pList.Select(expression.Compile()).ToList(); pageIndex = 1;
var list =await this.Clone().Skip(pageIndex - 1 * pageSize).Take(pageSize).ToListAsync(expression);
var countQueryable = this.Clone();
countQueryable.QueryBuilder.Includes = null;
totalNumber.Value =await countQueryable.CountAsync();
return list; return list;
} }
else else

View File

@@ -13,7 +13,8 @@ namespace SqlSugar
{ {
List<TResult> result = new List <TResult>(); List<TResult> result = new List <TResult>();
var isSqlFunc = IsSqlFunc(expression, queryableProvider); var isSqlFunc = IsSqlFunc(expression, queryableProvider);
if (isSqlFunc&&isGroup(expression, queryableProvider)) var isClass = IsClass(expression, queryableProvider);
if (isSqlFunc && isGroup(expression, queryableProvider))
{ {
var sqlfuncQueryable = queryableProvider.Clone(); var sqlfuncQueryable = queryableProvider.Clone();
sqlfuncQueryable.QueryBuilder.Includes = null; sqlfuncQueryable.QueryBuilder.Includes = null;
@@ -21,26 +22,81 @@ namespace SqlSugar
.Select(expression) .Select(expression)
.ToList(); .ToList();
var includeQueryable = queryableProvider.Clone(); var includeQueryable = queryableProvider.Clone();
includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context,queryableProvider.QueryBuilder)); includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context, queryableProvider.QueryBuilder));
includeQueryable.QueryBuilder.NoCheckInclude=true; includeQueryable.QueryBuilder.NoCheckInclude = true;
MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context); MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context);
} }
else if (isSqlFunc) else if (isSqlFunc)
{ {
var sqlfuncQueryable = queryableProvider.Clone(); result = SqlFunc(expression, queryableProvider);
sqlfuncQueryable.QueryBuilder.Includes = null; }
result = sqlfuncQueryable else if (typeof(TResult).IsAnonymousType() && isClass == false)
.Select(expression) {
.ToList(); result = SqlFunc(expression, queryableProvider);
var includeList = queryableProvider.Clone().ToList(); }
MegerList(result, includeList, sqlfuncQueryable.Context); else if (typeof(TResult).IsAnonymousType() && isClass == true)
{
result = Action(expression, queryableProvider);
} }
else else
{ {
result= queryableProvider.ToList().Select(expression.Compile()).ToList(); try
{
result = SqlFunc(expression, queryableProvider);
}
catch (Exception ex)
{
try
{
result = Action(expression, queryableProvider);
}
catch
{
throw ex;
}
}
} }
return result; return result;
} }
private static List<TResult> Action<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
List<TResult> result;
var entity = queryableProvider.Context.EntityMaintenance.GetEntityInfo<TResult>();
var list = queryableProvider.Clone().ToList();
var dt=queryableProvider.Context.Utilities.ListToDataTable(list);
foreach (System.Data.DataRow item in dt.Rows)
{
foreach (System.Data.DataColumn columnInfo in dt.Columns)
{
if (columnInfo.DataType.IsClass())
{
if (item[columnInfo.ColumnName] == null || item[columnInfo.ColumnName] == DBNull.Value)
{
item[columnInfo.ColumnName] = Activator.CreateInstance(columnInfo.DataType, true);
}
}
}
}
list = queryableProvider.Context.Utilities.DataTableToList<T>(dt);
result = list.Select(expression.Compile()).ToList();
return result;
}
private static List<TResult> SqlFunc<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
List<TResult> result;
var sqlfuncQueryable = queryableProvider.Clone();
sqlfuncQueryable.QueryBuilder.Includes = null;
result = sqlfuncQueryable
.Select(expression)
.ToList();
var includeList = queryableProvider.Clone().ToList();
MegerList(result, includeList, sqlfuncQueryable.Context);
return result;
}
internal static async Task<List<TResult>> GetListAsync<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider) internal static async Task<List<TResult>> GetListAsync<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{ {
List<TResult> result = new List<TResult>(); List<TResult> result = new List<TResult>();
@@ -121,6 +177,26 @@ namespace SqlSugar
i++; i++;
} }
} }
private static bool IsClass<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
var body = ExpressionTool.GetLambdaExpressionBody(expression);
if (body is NewExpression)
{
var newExp = ((NewExpression)body);
foreach (var item in newExp.Arguments)
{
if (item is MemberExpression)
{
var member = (MemberExpression)item;
if (member.Type.IsClass())
{
return true;
}
}
}
}
return false;
}
private static bool IsSqlFunc<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider) private static bool IsSqlFunc<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{ {

View File

@@ -138,11 +138,15 @@ namespace SqlSugar
var memberExpression = ((expression as LambdaExpression).Body as MemberExpression); var memberExpression = ((expression as LambdaExpression).Body as MemberExpression);
var listItemType = list.Where(it=>it!=null).FirstOrDefault()?.GetType(); var listItemType = list.Where(it=>it!=null).FirstOrDefault()?.GetType();
if (listItemType == null)
{
return;
}
if (listItemType.Name.StartsWith("List`")) if (listItemType.Name.StartsWith("List`"))
{ {
listItemType = listItemType.GetGenericArguments()[0]; listItemType = listItemType.GetGenericArguments()[0];
} }
if (listItemType == null) return; //if (listItemType == null) return;
var listItemEntity = this.Context.EntityMaintenance.GetEntityInfo(listItemType); var listItemEntity = this.Context.EntityMaintenance.GetEntityInfo(listItemType);
var listPkColumn = listItemEntity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault(); var listPkColumn = listItemEntity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault();

View File

@@ -1990,7 +1990,12 @@ namespace SqlSugar
{ {
if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0) if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0)
{ {
var list = this.ToPageList(pageIndex,pageSize,ref totalNumber).Select(expression.Compile()).ToList(); if (pageIndex == 0)
pageIndex = 1;
var list = this.Clone().Skip(pageIndex-1*pageSize).Take(pageSize).ToList(expression);
var countQueryable = this.Clone();
countQueryable.QueryBuilder.Includes = null;
totalNumber = countQueryable.Count();
return list; return list;
} }
else else
@@ -2272,8 +2277,12 @@ namespace SqlSugar
{ {
if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0) if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0)
{ {
var pList = await this.ToPageListAsync(pageIndex, pageSize, totalNumber); if (pageIndex == 0)
var list = pList.Select(expression.Compile()).ToList(); pageIndex = 1;
var list =await this.Clone().Skip(pageIndex - 1 * pageSize).Take(pageSize).ToListAsync(expression);
var countQueryable = this.Clone();
countQueryable.QueryBuilder.Includes = null;
totalNumber.Value =await countQueryable.CountAsync();
return list; return list;
} }
else else