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,6 +13,7 @@ namespace SqlSugar
{
List<TResult> result = new List <TResult>();
var isSqlFunc = IsSqlFunc(expression, queryableProvider);
var isClass = IsClass(expression, queryableProvider);
if (isSqlFunc && isGroup(expression, queryableProvider))
{
var sqlfuncQueryable = queryableProvider.Clone();
@@ -27,6 +28,65 @@ namespace SqlSugar
}
else if (isSqlFunc)
{
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
{
try
{
result = SqlFunc(expression, queryableProvider);
}
catch (Exception ex)
{
try
{
result = Action(expression, queryableProvider);
}
catch
{
throw ex;
}
}
}
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
@@ -34,13 +94,9 @@ namespace SqlSugar
.ToList();
var includeList = queryableProvider.Clone().ToList();
MegerList(result, includeList, sqlfuncQueryable.Context);
}
else
{
result= queryableProvider.ToList().Select(expression.Compile()).ToList();
}
return result;
}
internal static async Task<List<TResult>> GetListAsync<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
List<TResult> result = new List<TResult>();
@@ -121,6 +177,26 @@ namespace SqlSugar
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)
{

View File

@@ -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

View File

@@ -13,6 +13,7 @@ namespace SqlSugar
{
List<TResult> result = new List <TResult>();
var isSqlFunc = IsSqlFunc(expression, queryableProvider);
var isClass = IsClass(expression, queryableProvider);
if (isSqlFunc && isGroup(expression, queryableProvider))
{
var sqlfuncQueryable = queryableProvider.Clone();
@@ -27,6 +28,65 @@ namespace SqlSugar
}
else if (isSqlFunc)
{
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
{
try
{
result = SqlFunc(expression, queryableProvider);
}
catch (Exception ex)
{
try
{
result = Action(expression, queryableProvider);
}
catch
{
throw ex;
}
}
}
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
@@ -34,13 +94,9 @@ namespace SqlSugar
.ToList();
var includeList = queryableProvider.Clone().ToList();
MegerList(result, includeList, sqlfuncQueryable.Context);
}
else
{
result= queryableProvider.ToList().Select(expression.Compile()).ToList();
}
return result;
}
internal static async Task<List<TResult>> GetListAsync<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
List<TResult> result = new List<TResult>();
@@ -121,6 +177,26 @@ namespace SqlSugar
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)
{

View File

@@ -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();

View File

@@ -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