diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs index 7f78256c4..1265f51b4 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs @@ -64,6 +64,12 @@ namespace SqlSugar } return this; } + public QueryMethodInfo AddJoinInfo(Type joinEntityType,Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString expOnWhere, JoinType type = JoinType.Left) + { + var method = QueryableObj.GetType().GetMyMethod("AddJoinInfo", 4,typeof(Type), typeof(Dictionary), typeof(FormattableString), typeof(JoinType)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { joinEntityType, keyIsShortName_ValueIsType_Dictionary, expOnWhere, type }); + return this; + } public QueryMethodInfo AddJoinInfo(Type joinEntityType, string shortName, string onWhere, JoinType type = JoinType.Left) { var method = QueryableObj.GetType().GetMyMethod("AddJoinInfo", 4, typeof(string), typeof(string), typeof(string), typeof(JoinType)); @@ -88,6 +94,12 @@ namespace SqlSugar this.QueryableObj = method.Invoke(QueryableObj, new object[] { expShortName, expressionString }); return this; } + public QueryMethodInfo Where(Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString expressionString) + { + var method = QueryableObj.GetType().GetMyMethod("Where", 2, typeof(Dictionary), typeof(FormattableString)); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { keyIsShortName_ValueIsType_Dictionary, expressionString }); + return this; + } public QueryMethodInfo Where(List conditionalModels) { var method = QueryableObj.GetType().GetMyMethod("Where", 1, typeof(List)); @@ -158,6 +170,13 @@ namespace SqlSugar this.QueryableObj = method.Invoke(QueryableObj, new object[] { expShortName, expSelect, resultType }); return this; } + public QueryMethodInfo Select(Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString expSelect, Type resultType) + { + var method = QueryableObj.GetType().GetMyMethod("Select", 3, typeof(Dictionary), typeof(FormattableString), typeof(Type)); + method = method.MakeGenericMethod(resultType); + this.QueryableObj = method.Invoke(QueryableObj, new object[] { keyIsShortName_ValueIsType_Dictionary, expSelect, resultType }); + return this; + } public QueryMethodInfo Select(string selectorSql) { var method = QueryableObj.GetType().GetMyMethod("Select", 1, typeof(string)) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index f62764b8e..79651b7b3 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -580,6 +580,13 @@ namespace SqlSugar QueryBuilder.Parameters.Add(parameter); return this; } + public ISugarQueryable AddJoinInfo(Type JoinType, Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString onExpString, JoinType type = JoinType.Left) + { + var whereExp = DynamicCoreHelper.GetWhere(keyIsShortName_ValueIsType_Dictionary,onExpString); + var name=whereExp.Parameters.Last(it => it.Type == JoinType).Name; + var sql = this.QueryBuilder.GetExpressionValue(whereExp, ResolveExpressType.WhereMultiple).GetResultString(); + return AddJoinInfo(JoinType, name, sql,type); + } public ISugarQueryable AddJoinInfo(Type JoinType, string shortName, string joinWhere, JoinType type = JoinType.Left) { this.Context.InitMappingInfo(JoinType); @@ -926,6 +933,12 @@ namespace SqlSugar } return this; } + public ISugarQueryable Where(Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString expressionString) + { + var exp = DynamicCoreHelper.GetWhere(keyIsShortName_ValueIsType_Dictionary, expressionString); + _Where(exp); + return this; + } public virtual ISugarQueryable Where(string expShortName, FormattableString expressionString) { var exp = DynamicCoreHelper.GetWhere(expShortName, expressionString); @@ -1348,6 +1361,11 @@ namespace SqlSugar } return _Select(expression); } + public ISugarQueryable Select(Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString expSelect, Type resultType) + { + var exp = DynamicCoreHelper.GetMember(keyIsShortName_ValueIsType_Dictionary, resultType, expSelect); + return _Select(exp); + } public ISugarQueryable Select(string expShortName, FormattableString expSelect, Type resultType) { var exp = DynamicCoreHelper.GetMember(typeof(TResult), resultType, expShortName, expSelect); diff --git a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs index 55665aea4..ddb96d1bb 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IQueryable.cs @@ -63,8 +63,8 @@ namespace SqlSugar ISugarQueryable AddParameters(SugarParameter[] parameters); ISugarQueryable AddParameters(List parameters); ISugarQueryable AddJoinInfo(string tableName, string shortName, string joinWhere, JoinType type = JoinType.Left); - ISugarQueryable AddJoinInfo(Type JoinType, string shortName, string joinWhere, JoinType type = JoinType.Left); - + ISugarQueryable AddJoinInfo(Type JoinEntityType, string shortName, string joinWhere, JoinType type = JoinType.Left); + ISugarQueryable AddJoinInfo(Type JoinEntityType, Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString onExpString, JoinType type = JoinType.Left); /// /// if a property that is not empty is a condition /// @@ -86,6 +86,7 @@ namespace SqlSugar ISugarQueryable TranLock(DbLockType? LockType = DbLockType.Wait); ISugarQueryable Where(Expression> expression); ISugarQueryable Where(string expShortName, FormattableString expressionString); + ISugarQueryable Where(Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString expressionString); ISugarQueryable Where(string whereString, object parameters = null); ISugarQueryable Where(IFuncModel funcModel); ISugarQueryable Where(List conditionalModels); @@ -152,6 +153,7 @@ namespace SqlSugar bool Any(); Task AnyAsync(); ISugarQueryable Select(string expShortName, FormattableString expSelect, Type resultType); + ISugarQueryable Select(Dictionary keyIsShortName_ValueIsType_Dictionary, FormattableString expSelect, Type resultType); ISugarQueryable Select(string expShortName, FormattableString expSelect,Type EntityType, Type resultType); ISugarQueryable Select(string expShortName, FormattableString expSelect, Type resultType); ISugarQueryable Select(Expression expression); diff --git a/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs b/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs index 788f45963..a1f13dec3 100644 --- a/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs +++ b/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicCoreHelper.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Linq.Expressions; using System.Text; using System.Text.RegularExpressions; @@ -32,6 +33,46 @@ namespace SqlSugar return lambda; } + public static LambdaExpression GetWhere(Dictionary parameterDictionary, FormattableString whereSql) + { + var parameters = parameterDictionary.Select(it => Expression.Parameter(it.Value, it.Key)).ToArray(); + + // 提取 FormattableString 中的参数值 + var arguments = whereSql.GetArguments(); + + + var sql = ReplaceFormatParameters(whereSql.Format); + + // 构建动态表达式,使用常量表达式和 whereSql 中的参数值 + var lambda = SqlSugarDynamicExpressionParser.ParseLambda( + parameters, + typeof(bool), + sql, + whereSql.GetArguments() + ); + + return lambda; + } + public static LambdaExpression GetMember(Dictionary parameterDictionary, Type propertyType, FormattableString memberSql) + { + var parameters = parameterDictionary.Select(it=> Expression.Parameter(it.Value,it.Key)).ToArray(); + + // 提取 FormattableString 中的参数值 + var arguments = memberSql.GetArguments(); + + + var sql = ReplaceFormatParameters(memberSql.Format); + + // 构建动态表达式,使用常量表达式和 whereSql 中的参数值 + var lambda = SqlSugarDynamicExpressionParser.ParseLambda( + parameters, + propertyType, + sql, + memberSql.GetArguments() + ); + + return lambda; + } public static LambdaExpression GetMember(Type entityType,Type propertyType, string shortName, FormattableString memberSql) { var parameter = Expression.Parameter(entityType, "it"); diff --git a/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicParameters.cs b/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicParameters.cs new file mode 100644 index 000000000..863f7f2a4 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Json2Sql/DynamicLinq/DynamicParameters.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SqlSugar +{ + public class DynamicParameters + { + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 } }; + } + + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2, string parameterName3, Type parameterType3) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 }, { parameterName3, parameterType3 } }; + } + + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2, string parameterName3, Type parameterType3, string parameterName4, Type parameterType4) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 }, { parameterName3, parameterType3 }, { parameterName4, parameterType4 } }; + } + + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2, string parameterName3, Type parameterType3, string parameterName4, Type parameterType4, string parameterName5, Type parameterType5) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 }, { parameterName3, parameterType3 }, { parameterName4, parameterType4 }, { parameterName5, parameterType5 } }; + } + + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2, string parameterName3, Type parameterType3, string parameterName4, Type parameterType4, string parameterName5, Type parameterType5, string parameterName6, Type parameterType6) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 }, { parameterName3, parameterType3 }, { parameterName4, parameterType4 }, { parameterName5, parameterType5 }, { parameterName6, parameterType6 } }; + } + + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2, string parameterName3, Type parameterType3, string parameterName4, Type parameterType4, string parameterName5, Type parameterType5, string parameterName6, Type parameterType6, string parameterName7, Type parameterType7) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 }, { parameterName3, parameterType3 }, { parameterName4, parameterType4 }, { parameterName5, parameterType5 }, { parameterName6, parameterType6 }, { parameterName7, parameterType7 } }; + } + + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2, string parameterName3, Type parameterType3, string parameterName4, Type parameterType4, string parameterName5, Type parameterType5, string parameterName6, Type parameterType6, string parameterName7, Type parameterType7, string parameterName8, Type parameterType8) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 }, { parameterName3, parameterType3 }, { parameterName4, parameterType4 }, { parameterName5, parameterType5 }, { parameterName6, parameterType6 }, { parameterName7, parameterType7 }, { parameterName8, parameterType8 } }; + } + + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2, string parameterName3, Type parameterType3, string parameterName4, Type parameterType4, string parameterName5, Type parameterType5, string parameterName6, Type parameterType6, string parameterName7, Type parameterType7, string parameterName8, Type parameterType8, string parameterName9, Type parameterType9) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 }, { parameterName3, parameterType3 }, { parameterName4, parameterType4 }, { parameterName5, parameterType5 }, { parameterName6, parameterType6 }, { parameterName7, parameterType7 }, { parameterName8, parameterType8 }, { parameterName9, parameterType9 } }; + } + + public static Dictionary Create(string parameterName, Type parameterType1, string parameterName2, Type parameterType2, string parameterName3, Type parameterType3, string parameterName4, Type parameterType4, string parameterName5, Type parameterType5, string parameterName6, Type parameterType6, string parameterName7, Type parameterType7, string parameterName8, Type parameterType8, string parameterName9, Type parameterType9, string parameterName10, Type parameterType10) + { + return new Dictionary() { { parameterName, parameterType1 }, { parameterName2, parameterType2 }, { parameterName3, parameterType3 }, { parameterName4, parameterType4 }, { parameterName5, parameterType5 }, { parameterName6, parameterType6 }, { parameterName7, parameterType7 }, { parameterName8, parameterType8 }, { parameterName9, parameterType9 }, { parameterName10, parameterType10 } }; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index fd4d5e290..b20ba3441 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -193,6 +193,7 @@ +