Performance optimization

This commit is contained in:
sunkaixuan 2022-07-16 15:18:24 +08:00
parent 6b75ce3c0f
commit bf25ddcec4

View File

@ -14,7 +14,7 @@ namespace SqlSugar
List<TResult> result = new List <TResult>(); List<TResult> result = new List <TResult>();
var isSqlFunc = IsSqlFunc(expression, queryableProvider); var isSqlFunc = IsSqlFunc(expression, queryableProvider);
var isClass = IsClass(expression, queryableProvider); var isClass = IsClass(expression, queryableProvider);
if (isSqlFunc && isGroup(expression, queryableProvider)) if (isGroup(expression, queryableProvider))
{ {
var sqlfuncQueryable = queryableProvider.Clone(); var sqlfuncQueryable = queryableProvider.Clone();
sqlfuncQueryable.QueryBuilder.Includes = null; sqlfuncQueryable.QueryBuilder.Includes = null;
@ -92,11 +92,15 @@ namespace SqlSugar
result = sqlfuncQueryable result = sqlfuncQueryable
.Select(expression) .Select(expression)
.ToList(); .ToList();
var includeList = queryableProvider.Clone().ToList(); var selector = GetDefaultSelector(queryableProvider.Context.EntityMaintenance.GetEntityInfo<T>(), queryableProvider.QueryBuilder);
var queryable = queryableProvider.Select(selector).Clone();
queryable.QueryBuilder.NoCheckInclude = true;
var includeList = queryable.ToList();
MegerList(result, includeList, sqlfuncQueryable.Context); MegerList(result, includeList, sqlfuncQueryable.Context);
return result; 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>();
@ -135,7 +139,8 @@ namespace SqlSugar
{ {
var entity = context.EntityMaintenance.GetEntityInfo(type); var entity = context.EntityMaintenance.GetEntityInfo(type);
List<string> selector = new List<string>(); List<string> selector = new List<string>();
foreach (var item in entity.Columns.Where(it=>it.IsIgnore==false)) List<EntityColumnInfo> columns = GetListNavColumns(entity);
foreach (var item in columns)
{ {
if (queryBuilder.TableShortName.HasValue()) if (queryBuilder.TableShortName.HasValue())
{ {
@ -149,6 +154,40 @@ namespace SqlSugar
return string.Join(",", selector); return string.Join(",", selector);
} }
private static string GetDefaultSelector(EntityInfo entityInfo, QueryBuilder queryBuilder)
{
List<EntityColumnInfo> columns = GetListNavColumns(entityInfo);
var selector = new List<string>();
if (columns.Count == 0) return null;
foreach (var item in columns)
{
if (queryBuilder.TableShortName.HasValue())
{
selector.Add($" {queryBuilder.TableShortName}.{item.DbColumnName} as {item.DbColumnName}");
}
else
{
selector.Add($" {item.DbColumnName} as {item.DbColumnName}");
}
}
return string.Join(",", selector);
}
private static List<EntityColumnInfo> GetListNavColumns(EntityInfo entityInfo)
{
var list = entityInfo.Columns.Where(it => it.Navigat != null).Select(
it => it.Navigat.Name
).ToArray();
var list2 = entityInfo.Columns.Where(it => it.Navigat != null && it.Navigat.Name2 != null).Select(
it => it.Navigat.Name2
).ToArray();
var columns = entityInfo.Columns.Where(it => it.IsPrimarykey ||
list.Contains(it.PropertyName) ||
list2.Contains(it.PropertyName)
).ToList();
return columns;
}
private static void MegerList<TResult, T>(List<TResult> result, List<T> includeList,SqlSugarProvider context) private static void MegerList<TResult, T>(List<TResult> result, List<T> includeList,SqlSugarProvider context)
{ {
if (result.Count != includeList.Count) return; if (result.Count != includeList.Count) return;