From 14ba84c24b4a4a87ed6e8d9c1a26c668ed896a88 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 13 Nov 2020 10:21:09 +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=E6=A0=91=E4=B8=89=E5=85=83=E8=A1=A8=E8=BE=BE=E5=BC=8F?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=EF=BC=8C=E5=BD=93=20Test=20=E4=B8=BA?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E6=97=B6=E4=B8=8D=E8=A7=A3=E6=9E=90=E6=88=90?= =?UTF-8?q?=20case=20when=20end=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/UnitTest4.cs | 95 +++++++++++++++++++++++- FreeSql/Internal/CommonExpression.cs | 32 ++++++-- 2 files changed, 121 insertions(+), 6 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest4.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest4.cs index 09bce801..a6ff160e 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest4.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest4.cs @@ -1,4 +1,5 @@ -using System; +using FreeSql.DataAnnotations; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; @@ -11,6 +12,98 @@ namespace FreeSql.Tests public class UnitTest4 { + public record ts_iif(Guid id, string title); + [Fact] + public void IIF() + { + var fsql = g.sqlserver; + fsql.Delete().Where("1=1").ExecuteAffrows(); + var id = Guid.NewGuid(); + fsql.Insert(new ts_iif(id, "001")).ExecuteAffrows(); + + var item = fsql.Select().Where(a => a.id == (id != Guid.NewGuid() ? id : a.id)).First(); + Assert.Equal(id, item.id); + + var item2 = fsql.Select().First(a => new + { + xxx = id != Guid.NewGuid() ? a.id : Guid.Empty + }); + Assert.Equal(id, item2.xxx); + + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + var typeid = Guid.NewGuid(); + fsql.Insert(new ts_iif_type { id = typeid, name = "type001" }).ExecuteAffrows(); + fsql.Insert(new ts_iif_topic { id = id, typeid = typeid, title = "title001" }).ExecuteAffrows(); + + var more1 = true; + var more2 = (bool?)true; + var more3 = (bool?)false; + var more4 = (bool?)null; + var moreitem = fsql.Select().First(a => new + { + a.id, + a.title, + a.type + }); + Assert.Equal(id, moreitem.id); + Assert.Equal("title001", moreitem.title); + Assert.Equal(typeid, moreitem.type.id); + Assert.Equal("type001", moreitem.type.name); + var moreitem1 = fsql.Select().First(a => new + { + a.id, + a.title, + type1 = more1 == true ? a.type : null, + }); + Assert.Equal(id, moreitem1.id); + Assert.Equal("title001", moreitem1.title); + Assert.Equal(typeid, moreitem1.type1.id); + Assert.Equal("type001", moreitem1.type1.name); + var moreitem2 = fsql.Select().First(a => new + { + a.id, + a.title, + type2 = more2 == true ? a.type : null, + }); + Assert.Equal(id, moreitem2.id); + Assert.Equal("title001", moreitem2.title); + Assert.Equal(typeid, moreitem2.type2.id); + Assert.Equal("type001", moreitem2.type2.name); + var moreitem3 = fsql.Select().First(a => new + { + a.id, + a.title, + type3 = more3 == true ? a.type : null, + }); + Assert.Equal(id, moreitem3.id); + Assert.Equal("title001", moreitem3.title); + Assert.Null(moreitem3.type3); + var moreitem4 = fsql.Select().First(a => new + { + a.id, + a.title, + type4 = more4 == true ? a.type : null, + }); + Assert.Equal(id, moreitem4.id); + Assert.Equal("title001", moreitem4.title); + Assert.Null(moreitem4.type4); + } + class ts_iif_topic + { + public Guid id { get; set; } + public Guid typeid { get; set; } + [Navigate(nameof(typeid))] + public ts_iif_type type { get; set; } + public string title { get; set; } + } + class ts_iif_type + { + public Guid id { get; set; } + public string name { get; set; } + } + + public record ts_record(DateTime Date, int TemperatureC, int TemperatureF, string Summary) { public ts_record parent { get; set; } diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index b173c125..3e7ea011 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -70,6 +70,11 @@ namespace FreeSql.Internal else if (index == ReadAnonymousFieldAsCsName && string.IsNullOrEmpty(parent.CsName) == false) field.Append(_common.FieldAsAlias(parent.CsName)); if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type; return false; + case ExpressionType.Conditional: + var condExp = exp as ConditionalExpression; + if (condExp.Test.IsParameter() == false) return ReadAnonymousField(_tables, field, parent, ref index, + (bool)Expression.Lambda(condExp.Test).Compile().DynamicInvoke() ? condExp.IfTrue : condExp.IfFalse, select, diymemexp, whereGlobalFilter, findIncludeMany, isAllDtoMap); + break; case ExpressionType.Call: var callExp = exp as MethodCallExpression; //处理自定义SQL语句,如: ToList(new { @@ -703,11 +708,28 @@ namespace FreeSql.Internal case ExpressionType.Conditional: var condExp = exp as ConditionalExpression; var conditionalTestOldMapType = tsc.SetMapTypeReturnOld(null); - var conditionalTestSql = ExpressionLambdaToSql(condExp.Test, tsc); - tsc.SetMapTypeReturnOld(conditionalTestOldMapType); - var conditionalSql = _common.IIF(conditionalTestSql, ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc)); - tsc.SetMapTypeReturnOld(null); - return conditionalSql; + if (condExp.Test.IsParameter()) + { + var conditionalTestSql = ExpressionLambdaToSql(condExp.Test, tsc); + tsc.SetMapTypeReturnOld(conditionalTestOldMapType); + var conditionalSql = _common.IIF(conditionalTestSql, ExpressionLambdaToSql(condExp.IfTrue, tsc), ExpressionLambdaToSql(condExp.IfFalse, tsc)); + tsc.SetMapTypeReturnOld(null); + return conditionalSql; + } + if ((bool)Expression.Lambda(condExp.Test).Compile().DynamicInvoke()) + { + tsc.SetMapTypeReturnOld(conditionalTestOldMapType); + var conditionalSql = ExpressionLambdaToSql(condExp.IfTrue, tsc); + tsc.SetMapTypeReturnOld(null); + return conditionalSql; + } + else + { + tsc.SetMapTypeReturnOld(conditionalTestOldMapType); + var conditionalSql = ExpressionLambdaToSql(condExp.IfFalse, tsc); + tsc.SetMapTypeReturnOld(null); + return conditionalSql; + } case ExpressionType.Call: tsc.mapType = null; var exp3 = exp as MethodCallExpression;