diff --git a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QuerySelect.cs b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QuerySelect.cs index 4d8563c2b..77d868b8b 100644 --- a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QuerySelect.cs +++ b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QuerySelect.cs @@ -198,6 +198,13 @@ namespace MongoDbTest var list25 = db.Queryable().Where(it => it.Name == it.Name && it.Name=="a").ToList(); if (list25.Count!=1||list25.First().Name != "a") Cases.ThrowUnitError(); + + var list26 = db.Queryable().Select(it => new + { + Age1 = it.Age > 0? it.Age: 1, + Age2 =SqlFunc.IIF( it.Age > 0 , it.Age ,1), + }).ToList(); + if (list26.First().Age1 != list26.First().Age2) Cases.ThrowUnitError(); } [SqlSugar.SugarTable("UnitStudent1231sds3z1")] public class Student : MongoDbBase diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MemberInitExpressionTractor.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MemberInitExpressionTractor.cs index 9d13aac55..034f3834c 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MemberInitExpressionTractor.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MemberInitExpressionTractor.cs @@ -60,6 +60,10 @@ namespace SqlSugar.MongoDb { projectionDocument[fieldName] = json; } + else if (memberAssignment.Expression is MethodCallExpression callExpression&&callExpression.Method.Name==nameof(SqlFunc.IIF)) + { + projectionDocument[fieldName] = json; + } else { projectionDocument[fieldName] = "$" + json.ToString(); diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs index d77aa9737..38534a220 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs @@ -45,7 +45,7 @@ namespace SqlSugar.MongoDb var funcString = context.ToString(model); result = BsonDocument.Parse(funcString); } - else if (name.StartsWith("To")) + else if (name.StartsWith("To")||name==nameof(SqlFunc.IIF)) { var value = context.GetType().GetMethod(name).Invoke(context, new object[] { model }); result = BsonDocument.Parse(value?.ToString()); diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs index b6847449c..57bf46b48 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs @@ -662,6 +662,20 @@ namespace SqlSugar.MongoDb return inDoc.ToJson(UtilMethods.GetJsonWriterSettings()); } + public override string IIF(MethodCallExpressionModel model) + { + + var test = model.Args[0].MemberValue as Expression; + var ifTrue = model.Args[1].MemberValue as Expression; + var ifFalse = model.Args[2].MemberValue as Expression; + + // 构造 ConditionalExpression + var conditionalExpr = Expression.Condition(test, ifTrue, ifFalse); + + BsonValue testValue = new ConditionalExpressionTractor(context, null).Extract(conditionalExpr); + return testValue.ToJson(UtilMethods.GetJsonWriterSettings()); + } + #region Helper private static BsonValue GetMemberName(BsonValue memberName) {