Exp to sql support conditional ? true : false

This commit is contained in:
sunkaixuan
2019-02-09 18:49:32 +08:00
parent 4f1d1b3c7c
commit bf3cc6fbf5
4 changed files with 40 additions and 15 deletions

View File

@@ -409,6 +409,19 @@ namespace OrmTest.Demo
var test22 = db.Queryable<Student>().Where(it => !it.SchoolId.HasValue && it.SchoolId.HasValue).ToList();
var test23 = db.Queryable<Student>().Where(it => !(it.Id==1) && it.Name=="").ToList();
var test24 = db.Queryable<Student>().Where(it => string.IsNullOrEmpty("a")).Where(it=>string.IsNullOrEmpty(it.Name)).ToList();
var test25 = db.Queryable<Student>().Where(it => SqlFunc.IIF(it.Id==0,1,2)==1).ToList();
var test26 = db.Queryable<Student>().Where(it => (it.Name==null?2:3)==1 )
.ToList();
var test27 = db.Queryable<Student>().Select(x => new {
name=x.Name==null?"1":"2"
}).ToList();
var test28 = db.Queryable<Student>().Select(x => new Student{
Name = x.Name == null ? "1" : "2"
}).ToList();
//var test29 = db.Queryable<Student>().Select(x => new Student
//{
// Name = x.Name??"a"
//}).ToList();
}
public static void Page()
{

View File

@@ -129,7 +129,7 @@ namespace SqlSugar
if (parameter.BaseExpression is BinaryExpression || parameter.BaseExpression == null)
{
var oppoSiteExpression = isLeft == true ? parameter.BaseParameter.RightExpression : parameter.BaseParameter.LeftExpression;
if (parameter.CurrentExpression is MethodCallExpression)
if (parameter.CurrentExpression is MethodCallExpression||parameter.CurrentExpression is ConditionalExpression)
{
var appendValue = value;
if (this.Context.Result.Contains(ExpressionConst.FormatSymbol))
@@ -438,7 +438,7 @@ namespace SqlSugar
}
}
}
else if (item is MethodCallExpression|| item is UnaryExpression)
else if (item is MethodCallExpression|| item is UnaryExpression||item is ConditionalExpression)
{
this.Expression = item;
this.Start();

View File

@@ -5,27 +5,38 @@ using System.Linq.Expressions;
using System.Text;
namespace SqlSugar
{
public class ConditionalExpressionResolve:BaseResolve
public class ConditionalExpressionResolve: MethodCallExpressionResolve
{
public ConditionalExpressionResolve(ExpressionParameter parameter) : base(parameter)
public ConditionalExpressionResolve(ExpressionParameter parameter) : base(parameter)
{
string name = "IIF";
var express = base.Expression as ConditionalExpression;
var args = new List<Expression>() {
express.Test,
express.IfTrue,
express.IfFalse
};
var isLeft = parameter.IsLeft;
switch (base.Context.ResolveType)
MethodCallExpressionModel model = new MethodCallExpressionModel();
model.Args = new List<MethodCallExpressionArgs>();
switch (this.Context.ResolveType)
{
case ResolveExpressType.None:
case ResolveExpressType.WhereSingle:
case ResolveExpressType.WhereMultiple:
Check.Exception(name == "GetSelfAndAutoFill", "SqlFunc.GetSelfAndAutoFill can only be used in Select.");
base.Where(parameter, isLeft, name, args, model);
break;
case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple:
case ResolveExpressType.Update:
base.Select(parameter, isLeft, name, args, model);
break;
case ResolveExpressType.FieldSingle:
case ResolveExpressType.FieldMultiple:
case ResolveExpressType.Join:
case ResolveExpressType.ArraySingle:
case ResolveExpressType.ArrayMultiple:
case ResolveExpressType.Update:
base.Field(parameter, isLeft, name, args, model);
break;
default:
Check.Exception(true, "Does not support it.xx==value ? true:false , Use SqlFunc.IIF (it.xx==value,true,false)");
break;
}
}

View File

@@ -12,6 +12,7 @@ namespace SqlSugar
public MethodCallExpressionResolve(ExpressionParameter parameter) : base(parameter)
{
var express = base.Expression as MethodCallExpression;
if (express == null) return;
var isLeft = parameter.IsLeft;
string methodName = express.Method.Name;
var isValidNativeMethod = IsValidNativeMethod(express, methodName);
@@ -103,7 +104,7 @@ namespace SqlSugar
return false;
}
private void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft)
protected void SqlFuncMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft)
{
if (!CheckMethod(express))
{
@@ -188,7 +189,7 @@ namespace SqlSugar
}
}
private void Field(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, List<MethodCallExpressionArgs> appendArgs = null)
protected void Field(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, List<MethodCallExpressionArgs> appendArgs = null)
{
if (this.Context.ResolveType == ResolveExpressType.FieldSingle)
{
@@ -200,7 +201,7 @@ namespace SqlSugar
}
Where(parameter, isLeft, name, args, model);
}
private void Select(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, List<MethodCallExpressionArgs> appendArgs = null)
protected void Select(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, List<MethodCallExpressionArgs> appendArgs = null)
{
if (name == "GetSelfAndAutoFill")
{
@@ -227,7 +228,7 @@ namespace SqlSugar
parameter.BaseParameter.CommonTempData = GetMethodValue(name, model);
}
}
private void Where(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, List<MethodCallExpressionArgs> appendArgs = null)
protected void Where(ExpressionParameter parameter, bool? isLeft, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, List<MethodCallExpressionArgs> appendArgs = null)
{
foreach (var item in args)
{