private static object VisitLambda(LambdaExpression lambda, SQLExpressionVisitorContenxt context) { if (lambda.Body.NodeType == ExpressionType.MemberAccess && context.Seperator == " ") { MemberExpression m = lambda.Body as MemberExpression; if (m.Expression != null) { object r = VisitMemberAccess(m, context); if (!(r is PartialSqlString)) { return(r); } if (!m.Expression.Type.IsValueType) { return(r.ToString()); } return($"{r}={context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true)}"); } } return(Visit(lambda.Body, context)); }
internal FromExpression(IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory entityDefFactory) { _entityDefFactory = entityDefFactory; _expressionContext = new SQLExpressionVisitorContenxt(databaseEngine, entityDefFactory) { ParamPlaceHolderPrefix = databaseEngine.ParameterizedChar + "f__" }; }
private static object VisitBinary(BinaryExpression b, SQLExpressionVisitorContenxt context) { object left, right; bool rightIsNull; string operand = BindOperant(b.NodeType); //sep= " " ?? if (operand == "AND" || operand == "OR") { if (b.Left is MemberExpression m && m.Expression != null && m.Expression.NodeType == ExpressionType.Parameter) { left = new PartialSqlString(string.Format(GlobalSettings.Culture, "{0}={1}", VisitMemberAccess(m, context), context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true))); } else { left = Visit(b.Left, context); } m = b.Right as MemberExpression; if (m != null && m.Expression != null && m.Expression.NodeType == ExpressionType.Parameter) { right = new PartialSqlString(string.Format(GlobalSettings.Culture, "{0}={1}", VisitMemberAccess(m, context), context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true))); } else { right = Visit(b.Right, context); } if (left as PartialSqlString == null && right as PartialSqlString == null) { object result = Expression.Lambda(b).Compile().DynamicInvoke(); return(new PartialSqlString(context.DatabaesEngine.GetDbValueStatement(result, needQuoted: true))); } if (left as PartialSqlString == null) { left = ((bool)left) ? GetTrueExpression(context) : GetFalseExpression(context); } if (right as PartialSqlString == null) { right = ((bool)right) ? GetTrueExpression(context) : GetFalseExpression(context); } }
private static object VisitBinary(BinaryExpression b, SQLExpressionVisitorContenxt context) { object left; object right; bool rightIsNull; string operand = BindOperant(b.NodeType); if (operand == "AND" || operand == "OR") { if (b.Left is MemberExpression m && m.Expression != null && m.Expression.NodeType == ExpressionType.Parameter) { left = new PartialSqlString(string.Format(GlobalSettings.Culture, "{0}={1}", VisitMemberAccess(m, context), context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true))); } else { left = Visit(b.Left, context); } if (b.Right is MemberExpression mm && mm.Expression != null && mm.Expression.NodeType == ExpressionType.Parameter) { right = new PartialSqlString(string.Format(GlobalSettings.Culture, "{0}={1}", VisitMemberAccess(mm, context), context.DatabaesEngine.GetDbValueStatement(true, needQuoted: true))); }
internal FromExpression(IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory entityDefFactory) { this.entityDefFactory = entityDefFactory; _databaseEngine = databaseEngine; expressionContext = new SQLExpressionVisitorContenxt(databaseEngine, entityDefFactory); }
internal SelectExpression(IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory entityDefFactory) { _expressionContext = new SQLExpressionVisitorContenxt(databaseEngine, entityDefFactory); }
public static object Visit(Expression exp, SQLExpressionVisitorContenxt context) { if (exp == null) { return(string.Empty); } switch (exp.NodeType) { case ExpressionType.Lambda: return(VisitLambda(exp as LambdaExpression, context)); case ExpressionType.MemberAccess: return(VisitMemberAccess(exp as MemberExpression, context)); case ExpressionType.Constant: return(VisitConstant(exp as ConstantExpression, context)); case ExpressionType.Add: case ExpressionType.AddChecked: case ExpressionType.Subtract: case ExpressionType.SubtractChecked: case ExpressionType.Multiply: case ExpressionType.MultiplyChecked: case ExpressionType.Divide: case ExpressionType.Modulo: case ExpressionType.And: case ExpressionType.AndAlso: case ExpressionType.Or: case ExpressionType.OrElse: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.Equal: case ExpressionType.NotEqual: case ExpressionType.Coalesce: case ExpressionType.ArrayIndex: case ExpressionType.RightShift: case ExpressionType.LeftShift: case ExpressionType.ExclusiveOr: return(VisitBinary(exp as BinaryExpression, context)); case ExpressionType.Negate: case ExpressionType.NegateChecked: case ExpressionType.Not: case ExpressionType.Convert: case ExpressionType.ConvertChecked: case ExpressionType.ArrayLength: case ExpressionType.Quote: case ExpressionType.TypeAs: return(VisitUnary(exp as UnaryExpression, context)); case ExpressionType.Parameter: return(VisitParameter(exp as ParameterExpression, context)); case ExpressionType.Call: return(VisitMethodCall(exp as MethodCallExpression, context)); case ExpressionType.New: return(VisitNew(exp as NewExpression, context)); case ExpressionType.NewArrayInit: case ExpressionType.NewArrayBounds: return(VisitNewArray(exp as NewArrayExpression, context)); case ExpressionType.MemberInit: return(VisitMemberInit(exp as MemberInitExpression, context)); default: return(exp.ToString()); } }
internal WhereExpression(IDatabaseEngine databaseEngine, IDatabaseEntityDefFactory entityDefFactory) { this.databaseEngine = databaseEngine; expressionContext = new SQLExpressionVisitorContenxt(databaseEngine, entityDefFactory); expressionContext.ParamPlaceHolderPrefix = databaseEngine.ParameterizedChar + "w__"; }