private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, UnaryExpression expression) { switch (expression.NodeType) { case ExpressionType.Convert: return(Analyze(provider, previousAnalyze, expression.Operand)); case ExpressionType.ConvertChecked: return(Analyze(provider, previousAnalyze, expression.Operand)); case ExpressionType.Not: var analyzeResult = Analyze(provider, previousAnalyze, expression.Operand); analyzeResult.SetSql("(" + analyzeResult.GetSql() + ") = false"); return(analyzeResult); } return(null); }
private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, ConstantExpression expression, MemberExpression parentExpression, MemberExpression parentMemberExpression = null) { var valueObject = expression.Value.GetType().GetField(parentExpression.Member.Name).GetValue(expression.Value); if (valueObject == null) { return(new AnalyzeResult(null, null)); } //keep going deeper until valueObject is a system type if (valueObject.GetType().IsSystemType()) { return(new AnalyzeResult(null, valueObject)); } var value = valueObject.GetType().GetProperty(parentMemberExpression.Member.Name).GetValue(valueObject, null); return(new AnalyzeResult(null, value)); }
private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, MemberExpression expression, MemberExpression parentMemberExpression = null) { if (expression.Expression is MemberExpression) { return(Analyze(provider, previousAnalyze, (MemberExpression)expression.Expression, expression)); /*var memberExpression = (MemberExpression)expression.Expression; * if (memberExpression.Expression is ConstantExpression) * { * return Analyze(provider, previousAnalyze, (ConstantExpression)memberExpression.Expression, memberExpression); * }*/ } if (expression.Expression is ConstantExpression) { return(Analyze(provider, previousAnalyze, (ConstantExpression)expression.Expression, expression, parentMemberExpression)); } var pi = expression.Member.DeclaringType.GetProperty(expression.Member.Name); var attr = pi.GetCustomAttributes(typeof(SqlFieldAttribute), false).SingleOrDefault() as SqlFieldAttribute; return(new AnalyzeResult(attr != null ? attr.GetName(pi) : expression.Member.Name, null)); }
public AnalyzeResult(AnalyzeResult left, AnalyzeResult right) { _left = left; _right = right; }
private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, ConstantExpression expression) { return(new AnalyzeResult(null, expression.Value)); }
private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, Expression expression) { switch (expression.NodeType) { case ExpressionType.Add: break; //case ExpressionType.AddAssign: // break; //case ExpressionType.AddAssignChecked: // break; case ExpressionType.AddChecked: break; //case ExpressionType.AndAssign: // break; case ExpressionType.ArrayIndex: break; case ExpressionType.ArrayLength: break; //case ExpressionType.Assign: // break; //case ExpressionType.Block: // break; case ExpressionType.Call: return(Analyze(provider, previousAnalyze, (MethodCallExpression)expression)); case ExpressionType.Coalesce: break; case ExpressionType.Conditional: break; case ExpressionType.Constant: return(Analyze(provider, previousAnalyze, (ConstantExpression)expression)); case ExpressionType.Convert: break; case ExpressionType.ConvertChecked: break; //case ExpressionType.DebugInfo: // break; //case ExpressionType.Decrement: // break; //case ExpressionType.Default: // break; case ExpressionType.Divide: break; //case ExpressionType.DivideAssign: // break; //case ExpressionType.Dynamic: // break; case ExpressionType.Equal: case ExpressionType.NotEqual: case ExpressionType.And: case ExpressionType.AndAlso: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.Or: case ExpressionType.OrElse: return(Analyze(provider, previousAnalyze, (BinaryExpression)expression)); case ExpressionType.ExclusiveOr: break; //case ExpressionType.ExclusiveOrAssign: // break; //case ExpressionType.Extension: // break; //case ExpressionType.Goto: // break; //case ExpressionType.Increment: // break; //case ExpressionType.Index: // break; case ExpressionType.Invoke: break; //case ExpressionType.IsFalse: // break; //case ExpressionType.IsTrue: // break; //case ExpressionType.Label: // break; case ExpressionType.Lambda: break; case ExpressionType.LeftShift: break; //case ExpressionType.LeftShiftAssign: // break; case ExpressionType.ListInit: break; //case ExpressionType.Loop: // break; case ExpressionType.MemberAccess: return(Analyze(provider, previousAnalyze, (MemberExpression)expression)); case ExpressionType.MemberInit: break; case ExpressionType.Modulo: break; //case ExpressionType.ModuloAssign: // break; case ExpressionType.Multiply: break; //case ExpressionType.MultiplyAssign: // break; //case ExpressionType.MultiplyAssignChecked: // break; case ExpressionType.MultiplyChecked: break; case ExpressionType.Negate: break; case ExpressionType.NegateChecked: break; case ExpressionType.New: break; case ExpressionType.NewArrayBounds: break; case ExpressionType.NewArrayInit: break; case ExpressionType.Not: break; //case ExpressionType.OnesComplement: // break; //case ExpressionType.OrAssign: // break; case ExpressionType.Parameter: break; //case ExpressionType.PostDecrementAssign: // break; //case ExpressionType.PostIncrementAssign: // break; case ExpressionType.Power: break; //case ExpressionType.PowerAssign: // break; //case ExpressionType.PreDecrementAssign: // break; //case ExpressionType.PreIncrementAssign: // break; case ExpressionType.Quote: break; case ExpressionType.RightShift: break; //case ExpressionType.RightShiftAssign: // break; //case ExpressionType.RuntimeVariables: // break; case ExpressionType.Subtract: break; //case ExpressionType.SubtractAssign: // break; //case ExpressionType.SubtractAssignChecked: // break; case ExpressionType.SubtractChecked: break; //case ExpressionType.Switch: // break; //case ExpressionType.Throw: // break; //case ExpressionType.Try: // break; case ExpressionType.TypeAs: break; //case ExpressionType.TypeEqual: // break; case ExpressionType.TypeIs: break; case ExpressionType.UnaryPlus: break; //case ExpressionType.Unbox: // break; default: break; } if (expression is UnaryExpression) { return(Analyze(provider, previousAnalyze, (UnaryExpression)expression)); } var type = expression.GetType(); return(null); }
private static AnalyzeResult Analyze(IDatabaseProvider provider, AnalyzeResult previousAnalyze, BinaryExpression expression) { var analyzeLeft = Analyze(provider, previousAnalyze, expression.Left); var analyzeRight = Analyze(provider, analyzeLeft, expression.Right); var leftSql = analyzeLeft.GetSql(); if (leftSql == null) { leftSql = analyzeLeft.ParameterName; } var rightSql = analyzeRight.GetSql(); if (rightSql == null) { rightSql = provider.CreateParameterName(analyzeLeft.ParameterName); } var analyzeResult = new AnalyzeResult(analyzeLeft, analyzeRight); if (!analyzeLeft.HasParameterCombination && !analyzeRight.HasParameterCombination) { analyzeResult.SetParameterCombination(analyzeLeft.ParameterName, analyzeRight.ParameterValue); } switch (expression.NodeType) { case ExpressionType.Equal: if (analyzeRight.ParameterValue == null) { analyzeResult.SetSql(leftSql + " is null"); } else { analyzeResult.SetSql(leftSql + " = " + rightSql); } break; case ExpressionType.NotEqual: if (analyzeRight.ParameterValue == null) { analyzeResult.SetSql(leftSql + " is not null"); } else { analyzeResult.SetSql(leftSql + " <> " + rightSql); } break; case ExpressionType.GreaterThan: analyzeResult.SetSql(leftSql + " > " + rightSql); break; case ExpressionType.GreaterThanOrEqual: analyzeResult.SetSql(leftSql + " >= " + rightSql); break; case ExpressionType.LessThan: analyzeResult.SetSql(leftSql + " < " + rightSql); break; case ExpressionType.LessThanOrEqual: analyzeResult.SetSql(leftSql + " <= " + rightSql); break; case ExpressionType.AndAlso: case ExpressionType.And: analyzeResult.SetSql("(" + leftSql + ") and (" + rightSql + ")"); break; case ExpressionType.OrElse: case ExpressionType.Or: analyzeResult.SetSql("(" + leftSql + ") or (" + rightSql + ")"); break; default: return(null); } return(analyzeResult); }