From a47b8c0e1555207c60940161dddda7b26dad638f Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 5 May 2022 10:39:38 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20IIF=20=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E8=A7=A3=E6=9E=90=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Internal/CommonExpressionTest.cs | 258 ++++++++++++++++++ FreeSql/Internal/CommonExpression.cs | 4 +- 2 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs diff --git a/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs b/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs new file mode 100644 index 00000000..c4194767 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs @@ -0,0 +1,258 @@ +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Data.SqlClient; +using Xunit; + +namespace FreeSql.Tests.Internal +{ + + public class CommonExpressionTest + { + [Fact] + public void IIFTest01() + { + var fsql = g.sqlite; + var sql = ""; + var sb = new StringBuilder(); + + sql = fsql.Select().Where(a => a.Bool == true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1)", sql); + sql = fsql.Select().Where(a => a.Bool != true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" <> 1)", sql); + sql = fsql.Select().Where(a => a.Bool == false).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0)", sql); + sql = fsql.Select().Where(a => !a.Bool).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0)", sql); + sql = fsql.Select().Where(a => a.Bool).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1)", sql); + sql = fsql.Select().WhereCascade(a => a.Bool).Limit(10).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1) +limit 0,10", sql); + + sql = fsql.Select().Where(a => a.BoolNullable == true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1)", sql); + sql = fsql.Select().Where(a => a.BoolNullable != true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" <> 1)", sql); + sql = fsql.Select().Where(a => a.BoolNullable == false).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0)", sql); + sql = fsql.Select().Where(a => !a.BoolNullable.Value).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable.Value).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1)", sql); + + sql = fsql.Select().Where(a => a.Bool == true && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.Bool != true && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" <> 1 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.Bool == false && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => !a.Bool && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.Bool && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1 AND a.""Id"" > 0)", sql); + + sql = fsql.Select().Where(a => a.BoolNullable == true && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable != true && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" <> 1 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable == false && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => !a.BoolNullable.Value && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0 AND a.""Id"" > 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable.Value && a.Id > 0).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0)", sql); + + sql = fsql.Select().Where(a => a.Bool == true && a.Id > 0 && a.Bool == true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1)", sql); + sql = fsql.Select().Where(a => a.Bool != true && a.Id > 0 && a.Bool != true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" <> 1 AND a.""Id"" > 0 AND a.""Bool"" <> 1)", sql); + sql = fsql.Select().Where(a => a.Bool == false && a.Id > 0 && a.Bool == false).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0)", sql); + sql = fsql.Select().Where(a => !a.Bool && a.Id > 0 && !a.Bool).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0)", sql); + sql = fsql.Select().Where(a => a.Bool && a.Id > 0 && a.Bool).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1)", sql); + + sql = fsql.Select().Where(a => a.BoolNullable == true && a.Id > 0 && a.BoolNullable == true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1)", sql); + sql = fsql.Select().Where(a => a.BoolNullable != true && a.Id > 0 && a.BoolNullable != true).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" <> 1 AND a.""Id"" > 0 AND a.""BoolNullable"" <> 1)", sql); + sql = fsql.Select().Where(a => a.BoolNullable == false && a.Id > 0 && a.BoolNullable == false).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0)", sql); + sql = fsql.Select().Where(a => !a.BoolNullable.Value && a.Id > 0 && !a.BoolNullable.Value).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0)", sql); + sql = fsql.Select().Where(a => a.BoolNullable.Value && a.Id > 0 && a.BoolNullable.Value).ToSql(); + Assert.Equal(@"SELECT a.""Id"", a.""Bool"", a.""BoolNullable"" +FROM ""IIFTest01Model"" a +WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1)", sql); + + // IIF + sql = fsql.Select().ToSql(a => a.Bool == true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool != true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool == false ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.Bool ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.BoolNullable == true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable != true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable == false ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.BoolNullable.Value ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable.Value ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.Bool == true && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool != true && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool == false && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.Bool && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.BoolNullable == true && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable != true && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable == false && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.BoolNullable.Value && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable.Value && a.Id > 0 ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.Bool == true && a.Id > 0 && a.Bool == true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool != true && a.Id > 0 && a.Bool != true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 AND a.""Id"" > 0 AND a.""Bool"" <> 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool == false && a.Id > 0 && a.Bool == false ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.Bool && a.Id > 0 && !a.Bool ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.Bool && a.Id > 0 && a.Bool ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + + sql = fsql.Select().ToSql(a => a.BoolNullable == true && a.Id > 0 && a.BoolNullable == true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable != true && a.Id > 0 && a.BoolNullable != true ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 AND a.""Id"" > 0 AND a.""BoolNullable"" <> 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable == false && a.Id > 0 && a.BoolNullable == false ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => !a.BoolNullable.Value && a.Id > 0 && !a.BoolNullable.Value ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + sql = fsql.Select().ToSql(a => a.BoolNullable.Value && a.Id > 0 && a.BoolNullable.Value ? 10 : 11); + Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1 then 10 else 11 end) as1 +FROM ""IIFTest01Model"" a", sql); + } + + class IIFTest01Model + { + public int Id { get; set; } + public bool Bool { get; set; } + public bool? BoolNullable { get; set; } + } + } +} diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 05616d72..a7b96e84 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -759,7 +759,9 @@ namespace FreeSql.Internal var conditionalTestOldMapType = tsc.SetMapTypeReturnOld(null); if (condExp.Test.IsParameter()) { - var conditionalTestSql = ExpressionLambdaToSql(condExp.Test, tsc); + var condExp2 = condExp.Test; + if (condExp2.NodeType == ExpressionType.MemberAccess) condExp2 = Expression.Equal(condExp2, Expression.Constant(true)); + var conditionalTestSql = ExpressionLambdaToSql(condExp2, tsc); tsc.SetMapTypeReturnOld(conditionalTestOldMapType); var conditionalSql = _common.IIF(conditionalTestSql, ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc)); tsc.SetMapTypeReturnOld(null);