Update exp to sql

This commit is contained in:
sunkaixuan
2022-10-16 23:38:20 +08:00
parent 0dac38168b
commit 306d8ae46f
2 changed files with 71 additions and 4 deletions

View File

@@ -24,7 +24,8 @@ namespace SqlSugar
var includeQueryable = queryableProvider.Clone();
includeQueryable.Select(GetGroupSelect(typeof(T), queryableProvider.Context, queryableProvider.QueryBuilder));
includeQueryable.QueryBuilder.NoCheckInclude = true;
MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context);
var mappingColumn = GetMappingColumn(expression);
MegerList(result, includeQueryable.ToList(), sqlfuncQueryable.Context,mappingColumn);
}
else if (isSqlFunc)
{
@@ -87,20 +88,33 @@ namespace SqlSugar
private static List<TResult> SqlFunc<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
var mappingColumn = GetMappingColumn(expression);
List<TResult> result;
var sqlfuncQueryable = queryableProvider.Clone();
var dtoEntity = sqlfuncQueryable.Context.EntityMaintenance.GetEntityInfo<TResult>().Columns;
var tableEntity = sqlfuncQueryable.Context.EntityMaintenance.GetEntityInfo<T>().Columns;
var ignoreColumns = GetIgnoreColumns(dtoEntity,tableEntity);
sqlfuncQueryable.QueryBuilder.Includes = null;
result = sqlfuncQueryable
.IgnoreColumns(ignoreColumns)
.Select(expression)
.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,mappingColumn);
return result;
}
private static string[] GetIgnoreColumns(List<EntityColumnInfo> dtoEntity, List<EntityColumnInfo> tableEntity)
{
var column = (from dto in dtoEntity
join tab in tableEntity on dto.PropertyInfo.PropertyType equals tab.PropertyInfo.PropertyType
where tab.Navigat!=null
select tab.PropertyName).Distinct().ToArray();
return column;
}
internal static async Task<List<TResult>> GetListAsync<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
@@ -160,7 +174,7 @@ namespace SqlSugar
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,List<NavMappingColumn> navMappingColumns)
{
if (result.Count != includeList.Count) return;
var columns = context.EntityMaintenance.GetEntityInfo<T>().Columns;
@@ -178,6 +192,15 @@ namespace SqlSugar
z.PropertyName.Equals(column.PropertyName)&&
z.PropertyInfo.PropertyType==column.PropertyInfo.PropertyType
);
if (resColumn == null && navMappingColumns.Any(z => z.Value == column.PropertyName))
{
var mappingColumn = navMappingColumns.First(z => z.Value == column.PropertyName);
resColumn = resColumns
.FirstOrDefault(z =>
z.PropertyName.Equals(mappingColumn.Key) &&
z.PropertyInfo.PropertyType == column.PropertyInfo.PropertyType
);
}
if (resColumn != null)
{
var resItem= result[i];
@@ -245,11 +268,43 @@ namespace SqlSugar
}
return false;
}
private static List<NavMappingColumn> GetMappingColumn(Expression expression)
{
var body = ExpressionTool.GetLambdaExpressionBody(expression);
List<NavMappingColumn> result = new List<NavMappingColumn>();
if (body is NewExpression)
{
foreach (var item in ((NewExpression)body).Arguments)
{
}
}
else if (body is MemberInitExpression)
{
foreach (var item in ((MemberInitExpression)body).Bindings)
{
MemberAssignment memberAssignment = (MemberAssignment)item;
var key= memberAssignment.Member.Name;
var value = memberAssignment.Expression;
if (memberAssignment.Expression is MemberExpression)
{
result.Add(new NavMappingColumn() { Key=key,Value= ExpressionTool.GetMemberName(memberAssignment.Expression) });
}
}
}
return result;
}
private static bool isGroup<T, TResult>(Expression<Func<T, TResult>> expression, QueryableProvider<T> queryableProvider)
{
var isGroup=queryableProvider.QueryBuilder.GetGroupByString.HasValue();
return isGroup;
}
internal class NavMappingColumn
{
public string Key { get; set; }
public string Value { get; set; }
}
}
}

View File

@@ -604,7 +604,19 @@ namespace SqlSugar
public virtual string GetSelectValueByExpression()
{
var expression = this.SelectValue as Expression;
var result = GetExpressionValue(expression, this.SelectType).GetResultString();
string result = string.Empty;
if (this.IgnoreColumns != null && this.IgnoreColumns.Any())
{
var expArray = GetExpressionValue(expression, this.SelectType).GetResultArray()
.Where(it=>
!this.IgnoreColumns.Any(z=>it.Contains(Builder.GetTranslationColumnName(z)))
).ToArray();
result =string.Join(",", expArray);
}
else
{
result= GetExpressionValue(expression, this.SelectType).GetResultString();
}
if (result == null)
{
return "*";