Update exp to sql

This commit is contained in:
sunkaixuan
2022-04-13 18:25:00 +08:00
parent 6fb102de29
commit 1af0b3b053
4 changed files with 20 additions and 4 deletions

View File

@@ -55,7 +55,7 @@ namespace OrmTest
var list2 = db.Queryable<StudentA>() var list2 = db.Queryable<StudentA>()
.Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include .Includes(x => x.SchoolA, x => x.RoomList)//2个参数就是 then Include
.Includes(x => x.Books) .Includes(x => x.Books)
.Where(x=>x.Books.Any()) .Where(x=>x.Books.Any(z=>z.BookId==1))
.Where(x => x.SchoolA.SchoolName == "北大") .Where(x => x.SchoolA.SchoolName == "北大")
.ToList(); .ToList();

View File

@@ -319,7 +319,7 @@ namespace SqlSugar
return methodCallExpressionArgs; return methodCallExpressionArgs;
} }
protected string GetNewExpressionValue(Expression item) public string GetNewExpressionValue(Expression item)
{ {
var newContext = this.Context.GetCopyContextWithMapping(); var newContext = this.Context.GetCopyContextWithMapping();
newContext.Resolve(item, this.Context.IsJoin ? ResolveExpressType.WhereMultiple : ResolveExpressType.WhereSingle); newContext.Resolve(item, this.Context.IsJoin ? ResolveExpressType.WhereMultiple : ResolveExpressType.WhereSingle);

View File

@@ -244,7 +244,7 @@ namespace SqlSugar
{ {
try try
{ {
OneToManyNavgateExpression nav=new OneToManyNavgateExpression(this.Context?.SugarContext?.Context); OneToManyNavgateExpression nav=new OneToManyNavgateExpression(this.Context?.SugarContext?.Context,this);
if (nav.IsNavgate(express)) if (nav.IsNavgate(express))
{ {
var sql = nav.GetSql(); var sql = nav.GetSql();

View File

@@ -16,9 +16,12 @@ namespace SqlSugar
public string ShorName; public string ShorName;
private string MemberName; private string MemberName;
private string MethodName; private string MethodName;
public OneToManyNavgateExpression(SqlSugarProvider context) private string whereSql;
private MethodCallExpressionResolve methodCallExpressionResolve;
public OneToManyNavgateExpression(SqlSugarProvider context, MethodCallExpressionResolve methodCallExpressionResolve)
{ {
this.context = context; this.context = context;
this.methodCallExpressionResolve = methodCallExpressionResolve;
} }
internal bool IsNavgate(Expression expression) internal bool IsNavgate(Expression expression)
@@ -36,11 +39,22 @@ namespace SqlSugar
if (memberExp.Method.Name.IsIn("Any","Count") && memberExp.Arguments.Count>0 && memberExp.Arguments[0] is MemberExpression ) if (memberExp.Method.Name.IsIn("Any","Count") && memberExp.Arguments.Count>0 && memberExp.Arguments[0] is MemberExpression )
{ {
result = ValidateNav(result, memberExp.Arguments[0] as MemberExpression, memberExp.Arguments[0]); result = ValidateNav(result, memberExp.Arguments[0] as MemberExpression, memberExp.Arguments[0]);
if (memberExp.Arguments.Count > 1)
{
whereSql = GetWhereSql(memberExp);
}
} }
} }
return result; return result;
} }
private string GetWhereSql(MethodCallExpression memberExp)
{
var whereExp = memberExp.Arguments[1];
var result= this.methodCallExpressionResolve.GetNewExpressionValue(whereExp);
return result;
}
private bool ValidateNav(bool result, MemberExpression memberExp, Expression childExpression) private bool ValidateNav(bool result, MemberExpression memberExp, Expression childExpression)
{ {
if (childExpression != null && childExpression is MemberExpression) if (childExpression != null && childExpression is MemberExpression)
@@ -90,6 +104,7 @@ namespace SqlSugar
selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName); selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName);
mapper.Sql = queryable mapper.Sql = queryable
.AS(this.ProPertyEntity.DbTableName) .AS(this.ProPertyEntity.DbTableName)
.WhereIF(!string.IsNullOrEmpty(whereSql),whereSql)
.Where($" {ShorName}.{name}={pk} ").Select(selectName).ToSql().Key; .Where($" {ShorName}.{name}={pk} ").Select(selectName).ToSql().Key;
mapper.Sql = $" ({mapper.Sql}) "; mapper.Sql = $" ({mapper.Sql}) ";
mapper.Sql = GetMethodSql(mapper.Sql); mapper.Sql = GetMethodSql(mapper.Sql);
@@ -107,6 +122,7 @@ namespace SqlSugar
//selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName); //selectName = queryable.QueryBuilder.Builder.GetTranslationColumnName(selectName);
mapper.Sql = queryable mapper.Sql = queryable
.AS(this.ProPertyEntity.DbTableName) .AS(this.ProPertyEntity.DbTableName)
.WhereIF(!string.IsNullOrEmpty(whereSql), whereSql)
.Where($" {name}={ShorName}.{pk} ").Select(" COUNT(1) ").ToSql().Key; .Where($" {name}={ShorName}.{pk} ").Select(" COUNT(1) ").ToSql().Key;
mapper.Sql = $" ({mapper.Sql}) "; mapper.Sql = $" ({mapper.Sql}) ";
mapper.Sql = GetMethodSql(mapper.Sql); mapper.Sql = GetMethodSql(mapper.Sql);