From 256963907e65aa496a7d116f30809d72222c6a13 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 29 Jul 2019 10:27:39 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E4=B8=AD=E4=B8=8D=E8=83=BD=E4=BD=BF=E7=94=A8=20c#=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=20>=20?= =?UTF-8?q?=E5=A6=82=EF=BC=9Awhere(a=20=3D>=20HttpContext.Session.GetStrin?= =?UTF-8?q?g("UserID")=20=3D=3D=20a.UserId)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/UnitTest1.cs | 4 +++- .../Extensions/LambadaExpressionExtensions.cs | 18 ++++++++++++++++++ FreeSql/Internal/CommonExpression.cs | 7 ++++++- 3 files changed, 27 insertions(+), 2 deletions(-) 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); }