mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-20 02:29:39 +08:00
Update nav query
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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();
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user