Update exp to sql

This commit is contained in:
sunkaixuan 2022-07-13 16:59:25 +08:00
parent 5dec2c662d
commit ac7df08ad5
5 changed files with 91 additions and 6 deletions

View File

@ -39,7 +39,7 @@ namespace SqlSugar
.Rows.Cast<System.Data.DataRow>().Select(it => it[0]).ToList();
var childList = this._Context.Queryable<TChild>().In(thisPkColumn.DbColumnName, bids).ToList();
var childList = GetChildList<TChild>().In(thisPkColumn.DbColumnName, bids).ToList();
if (IsDeleteB())

View File

@ -28,7 +28,7 @@ namespace SqlSugar
SetContext(() => this._Context.Deleteable(prentList).ExecuteCommand());
var ids = _ParentList.Select(it => parentPkColumn.PropertyInfo.GetValue(it)).ToList();
var childList = this._Context.Queryable<TChild>().In(thisFkColumn.DbColumnName, ids).ToList();
var childList = GetChildList<TChild>().In(thisFkColumn.DbColumnName, ids).ToList();
this._ParentList = childList.Cast<object>().ToList();
this._ParentPkColumn = thisPkColumn;
@ -37,6 +37,20 @@ namespace SqlSugar
SetContext(() => this._Context.Deleteable(childList).ExecuteCommand());
}
private ISugarQueryable<TChild> GetChildList<TChild>() where TChild : class, new()
{
var queryable = this._Context.Queryable<TChild>();
if (_WhereList.HasValue())
{
foreach (var item in _WhereList)
{
queryable.Where(item);
}
queryable.AddParameters(_Parameters);
}
return queryable;
}
private void SetContext(Action action)
{
var key = "_DeleteNavTask";

View File

@ -17,11 +17,13 @@ namespace SqlSugar
public EntityColumnInfo _ParentPkColumn { get; set; }
public SqlSugarProvider _Context { get; set; }
public bool _IsDeletedParant { get; set; }
public List<string> _WhereList = new List<string>();
public List<SugarParameter> _Parameters = new List<SugarParameter>();
public DeleteNavProvider<Root, TChild> ThenInclude< TChild>(Expression<Func<T, TChild>> expression)
where TChild : class, new()
{
InitParentList();
Expression newExp = GetMamber(expression);
var name = ExpressionTool.GetMemberName(expression);
var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name);
if (nav.Navigat == null)
@ -47,7 +49,8 @@ namespace SqlSugar
where TChild : class, new()
{
InitParentList();
var name = ExpressionTool.GetMemberName(expression);
Expression newExp = GetMamber(expression);
var name = ExpressionTool.GetMemberName(newExp);
var nav = this._ParentEntity.Columns.FirstOrDefault(x => x.PropertyName == name);
if (nav.Navigat == null)
{
@ -67,6 +70,61 @@ namespace SqlSugar
}
return GetResult<TChild>();
}
private Expression GetMamber(Expression expression)
{
int i = 0;
Expression newExp =ExpressionTool.GetLambdaExpressionBody(expression);
while (newExp is MethodCallExpression)
{
var callMethod = (newExp as MethodCallExpression);
ActionMethodCallExpression(callMethod);
newExp = callMethod.Arguments[0];
i++;
Check.Exception(i > 10000, expression + " is error");
}
return newExp;
}
private void ActionMethodCallExpression(MethodCallExpression method)
{
var queryBuilder = GetQueryBuilder();
NavigatManager<T> navigatManager = new NavigatManager<T>()
{
Context = this._Context
};
if (method.Method.Name == "ToList")
{
}
else if (method.Method.Name == "Where")
{
navigatManager.CheckHasRootShortName(method.Arguments[0], method.Arguments[1]);
var exp = method.Arguments[1];
_WhereList.Add(" " + queryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString());
}
else if (method.Method.Name == "WhereIF")
{
var isOk = LambdaExpression.Lambda(method.Arguments[1]).Compile().DynamicInvoke();
if (isOk.ObjToBool())
{
var exp = method.Arguments[2];
navigatManager.CheckHasRootShortName(method.Arguments[1], method.Arguments[2]);
_WhereList.Add(" " + queryBuilder.GetExpressionValue(exp, ResolveExpressType.WhereSingle).GetString());
}
}
if (queryBuilder.Parameters != null)
{
_Parameters.AddRange(queryBuilder.Parameters);
}
}
private QueryBuilder GetQueryBuilder()
{
return this._Context.Queryable<T>().QueryBuilder;
}
private DeleteNavProvider<Root, TChild> GetResult<TChild>() where TChild : class, new()
{
return new DeleteNavProvider<Root, TChild>()

View File

@ -649,7 +649,7 @@ namespace SqlSugar
result.SelectString = result.SelectString + "," + selectPkName;
}
}
private void CheckHasRootShortName(Expression rootExpression, Expression childExpression)
public void CheckHasRootShortName(Expression rootExpression, Expression childExpression)
{
var rootShortName = GetShortName(rootExpression);
if (rootShortName.HasValue()&& childExpression.ToString().Contains($" {rootShortName}."))

View File

@ -91,6 +91,19 @@ namespace SqlSugar
else
return value;
}
public static Expression GetLambdaExpressionBody(Expression expression)
{
Expression newExp = expression;
if (newExp is LambdaExpression)
{
newExp = (newExp as LambdaExpression).Body;
}
return newExp;
}
public static Type GetMemberInfoType(MemberInfo member)
{
switch (member.MemberType)