diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavSelectHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavSelectHelper.cs index 2b9d155bd..31f314088 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavSelectHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavSelectHelper.cs @@ -13,7 +13,8 @@ namespace SqlSugar { List result = new List (); var isSqlFunc = IsSqlFunc(expression, queryableProvider); - if (isSqlFunc&&isGroup(expression, queryableProvider)) + var isClass = IsClass(expression, queryableProvider); + if (isSqlFunc && isGroup(expression, queryableProvider)) { var sqlfuncQueryable = queryableProvider.Clone(); sqlfuncQueryable.QueryBuilder.Includes = null; @@ -21,26 +22,81 @@ namespace SqlSugar .Select(expression) .ToList(); var includeQueryable = queryableProvider.Clone(); - includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context,queryableProvider.QueryBuilder)); - includeQueryable.QueryBuilder.NoCheckInclude=true; + includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context, queryableProvider.QueryBuilder)); + includeQueryable.QueryBuilder.NoCheckInclude = true; MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context); } - else if (isSqlFunc) + else if (isSqlFunc) { - var sqlfuncQueryable = queryableProvider.Clone(); - sqlfuncQueryable.QueryBuilder.Includes = null; - result = sqlfuncQueryable - .Select(expression) - .ToList(); - var includeList = queryableProvider.Clone().ToList(); - MegerList(result, includeList, sqlfuncQueryable.Context); + result = SqlFunc(expression, queryableProvider); + } + else if (typeof(TResult).IsAnonymousType() && isClass == false) + { + result = SqlFunc(expression, queryableProvider); + } + else if (typeof(TResult).IsAnonymousType() && isClass == true) + { + result = Action(expression, queryableProvider); } 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; } + + private static List Action(Expression> expression, QueryableProvider queryableProvider) + { + List result; + var entity = queryableProvider.Context.EntityMaintenance.GetEntityInfo(); + 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(dt); + result = list.Select(expression.Compile()).ToList(); + return result; + } + + private static List SqlFunc(Expression> expression, QueryableProvider queryableProvider) + { + List 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> GetListAsync(Expression> expression, QueryableProvider queryableProvider) { List result = new List(); @@ -121,6 +177,26 @@ namespace SqlSugar i++; } } + private static bool IsClass(Expression> expression, QueryableProvider 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(Expression> expression, QueryableProvider queryableProvider) { diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index dd097835b..6106fb328 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -1990,7 +1990,12 @@ namespace SqlSugar { 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; } else @@ -2272,8 +2277,12 @@ namespace SqlSugar { if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0) { - var pList = await this.ToPageListAsync(pageIndex, pageSize, totalNumber); - var list = pList.Select(expression.Compile()).ToList(); + if (pageIndex == 0) + 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; } else diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavSelectHelper.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavSelectHelper.cs index 2b9d155bd..31f314088 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavSelectHelper.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavSelectHelper.cs @@ -13,7 +13,8 @@ namespace SqlSugar { List result = new List (); var isSqlFunc = IsSqlFunc(expression, queryableProvider); - if (isSqlFunc&&isGroup(expression, queryableProvider)) + var isClass = IsClass(expression, queryableProvider); + if (isSqlFunc && isGroup(expression, queryableProvider)) { var sqlfuncQueryable = queryableProvider.Clone(); sqlfuncQueryable.QueryBuilder.Includes = null; @@ -21,26 +22,81 @@ namespace SqlSugar .Select(expression) .ToList(); var includeQueryable = queryableProvider.Clone(); - includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context,queryableProvider.QueryBuilder)); - includeQueryable.QueryBuilder.NoCheckInclude=true; + includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context, queryableProvider.QueryBuilder)); + includeQueryable.QueryBuilder.NoCheckInclude = true; MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context); } - else if (isSqlFunc) + else if (isSqlFunc) { - var sqlfuncQueryable = queryableProvider.Clone(); - sqlfuncQueryable.QueryBuilder.Includes = null; - result = sqlfuncQueryable - .Select(expression) - .ToList(); - var includeList = queryableProvider.Clone().ToList(); - MegerList(result, includeList, sqlfuncQueryable.Context); + result = SqlFunc(expression, queryableProvider); + } + else if (typeof(TResult).IsAnonymousType() && isClass == false) + { + result = SqlFunc(expression, queryableProvider); + } + else if (typeof(TResult).IsAnonymousType() && isClass == true) + { + result = Action(expression, queryableProvider); } 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; } + + private static List Action(Expression> expression, QueryableProvider queryableProvider) + { + List result; + var entity = queryableProvider.Context.EntityMaintenance.GetEntityInfo(); + 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(dt); + result = list.Select(expression.Compile()).ToList(); + return result; + } + + private static List SqlFunc(Expression> expression, QueryableProvider queryableProvider) + { + List 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> GetListAsync(Expression> expression, QueryableProvider queryableProvider) { List result = new List(); @@ -121,6 +177,26 @@ namespace SqlSugar i++; } } + private static bool IsClass(Expression> expression, QueryableProvider 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(Expression> expression, QueryableProvider queryableProvider) { diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index cd02ab523..4bc37d705 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -138,11 +138,15 @@ namespace SqlSugar var memberExpression = ((expression as LambdaExpression).Body as MemberExpression); var listItemType = list.Where(it=>it!=null).FirstOrDefault()?.GetType(); + if (listItemType == null) + { + return; + } if (listItemType.Name.StartsWith("List`")) { listItemType = listItemType.GetGenericArguments()[0]; } - if (listItemType == null) return; + //if (listItemType == null) return; var listItemEntity = this.Context.EntityMaintenance.GetEntityInfo(listItemType); var listPkColumn = listItemEntity.Columns.Where(it => it.IsPrimarykey).FirstOrDefault(); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index dd097835b..6106fb328 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -1990,7 +1990,12 @@ namespace SqlSugar { 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; } else @@ -2272,8 +2277,12 @@ namespace SqlSugar { if (this.QueryBuilder.Includes!=null&&this.QueryBuilder.Includes.Count > 0) { - var pList = await this.ToPageListAsync(pageIndex, pageSize, totalNumber); - var list = pList.Select(expression.Compile()).ToList(); + if (pageIndex == 0) + 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; } else