diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index 1a384f60..5bd98ca9 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -322,10 +322,12 @@ namespace FreeSql.Tests [Fact] public void Test1() { - g.sqlite.Aop.ParseExpression += parseExp; + //g.sqlite.Aop.ParseExpression += parseExp; var sqddddl = g.sqlite.Select().ToSql(t => t.OptionsEntity04 == "1".TryTo()); + //var sqdddd2 = g.sqlite.Select().ToSql(t => t.OptionsEntity04 == t.NamespaceName.TryTo()); + var sqksdkfjl = g.sqlite.Select() .LeftJoin(a => a.Templates.Id2 == a.TemplatesId) .LeftJoin(a => a.Parent.Id == a.Id) diff --git a/FreeSql/Extensions/LambadaExpressionExtensions.cs b/FreeSql/Extensions/LambadaExpressionExtensions.cs index 9ad328ee..1dd7864e 100644 --- a/FreeSql/Extensions/LambadaExpressionExtensions.cs +++ b/FreeSql/Extensions/LambadaExpressionExtensions.cs @@ -86,6 +86,13 @@ namespace System.Linq.Expressions var body = Expression.Not(exp.Body); return Expression.Lambda>(body, candidateExpr); } + + internal static bool IsParameter(this Expression exp) + { + var test = new TextParameterExpressionVisitor(); + test.Visit(exp); + return test.Result; + } } internal class NewExpressionVisitor : ExpressionVisitor @@ -102,4 +109,15 @@ namespace System.Linq.Expressions protected override Expression VisitParameter(ParameterExpression node) => node == _oldParameter ? this._newParameter : node; } + + internal class TextParameterExpressionVisitor : ExpressionVisitor + { + public bool Result { get; private set; } + + protected override Expression VisitParameter(ParameterExpression node) + { + if (!Result) Result = true; + return node; + } + } } \ No newline at end of file diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 2d7360f5..deb5cb77 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -837,6 +837,7 @@ namespace FreeSql.Internal //} var other3Exp = ExpressionLambdaToSqlOther(exp3, tsc); if (string.IsNullOrEmpty(other3Exp) == false) return other3Exp; + if (exp3.IsParameter() == false) return formatSql(Expression.Lambda(exp3).Compile().DynamicInvoke(), tsc.mapType); throw new Exception($"未实现函数表达式 {exp3} 解析"); case ExpressionType.Parameter: case ExpressionType.MemberAccess: @@ -1097,7 +1098,11 @@ namespace FreeSql.Internal case ExpressionType.Coalesce: return _common.IsNull(ExpressionLambdaToSql(expBinary.Left, tsc), ExpressionLambdaToSql(expBinary.Right, tsc)); } - if (dicExpressionOperator.TryGetValue(expBinary.NodeType, out var tryoper) == false) return ""; + if (dicExpressionOperator.TryGetValue(expBinary.NodeType, out var tryoper) == false) + { + if (exp.IsParameter() == false) return formatSql(Expression.Lambda(exp).Compile().DynamicInvoke(), tsc.mapType); + return ""; + } return ExpressionBinary(tryoper, expBinary.Left, expBinary.Right, tsc); }