public static Where Parse(LambdaExpression expressions, IEnumerable <IPropertyMap> propertymap) { var indexcontent = new IndexContent(); var re = new Where(indexcontent.Index, propertymap); re.Rosolve(expressions, re, indexcontent); return(re); }
private void PropertyExpression(MemberExpression expr, Where item, IndexContent indexContent, bool IsValue) { if (IsValue) { this._value = expr.Member as PropertyInfo; this.Rosolve(expr.Expression, item, indexContent, IsValue); } else { var p = item.propertymap.First(t => t.PropertyInfo == expr.Member as PropertyInfo); item.property = p; } }
private void MethodCallExpression(MethodCallExpression expr, Where node, IndexContent indexContent) { switch (expr.Method.Name) { case nameof(string.Contains): node.Operator = " like "; break; } this.Rosolve(expr.Object, node, indexContent); if (expr.Arguments.Count() > 0) { this.Rosolve(expr.Arguments.First(), node, indexContent, true); } }
private void MemberExpression(MemberExpression expr, Where node, IndexContent indexContent, bool isValue = false) { if (node != null) { switch (expr.Member.MemberType) { case MemberTypes.Property: this.PropertyExpression(expr, node, indexContent, isValue); break; case MemberTypes.Field: this.FieldExpression(expr, node); break; } } }
public void Rosolve(Expression exp, Where item, IndexContent indexContent, bool IsValue = false) { if (item == null) { item = new Where(++indexContent.Index, item.propertymap); } BinaryExpression bexp; switch (exp.NodeType) { case ExpressionType.Lambda: exp = ((LambdaExpression)exp).Body; this.Rosolve(exp, item, indexContent, IsValue); break; case ExpressionType.Convert: exp = ((UnaryExpression)exp).Operand; this.Rosolve(exp, item, indexContent, IsValue); break; case ExpressionType.AndAlso: bexp = (BinaryExpression)exp; item.SpliceWay = " and "; item.Left = new Where(++indexContent.Index, item.propertymap); this.Rosolve(bexp.Left, item.Left as Where, indexContent, IsValue); item.Right = new Where(++indexContent.Index, item.propertymap); this.Rosolve(bexp.Right, item.Right as Where, indexContent, IsValue); break; case ExpressionType.OrElse: bexp = (BinaryExpression)exp; item.SpliceWay = " or "; item.Left = new Where(++indexContent.Index, item.propertymap); this.Rosolve(bexp.Left, item.Left as Where, indexContent, IsValue); item.Right = new Where(++indexContent.Index, item.propertymap); this.Rosolve(bexp.Right, item.Right as Where, indexContent, IsValue); break; case ExpressionType.MemberAccess: MemberExpression((MemberExpression)exp, item, indexContent, IsValue); break; case ExpressionType.Call: MethodCallExpression((MethodCallExpression)exp, item, indexContent); break; case ExpressionType.Equal: bexp = (BinaryExpression)exp; item.Operator = " = "; this.Rosolve(bexp.Left, item, indexContent, IsValue); this.Rosolve(bexp.Right, item, indexContent, true); break; case ExpressionType.NotEqual: bexp = (BinaryExpression)exp; item.Operator = " <> "; this.Rosolve(bexp.Left, item, indexContent, IsValue); this.Rosolve(bexp.Right, item, indexContent, true); break; case ExpressionType.LessThan: bexp = (BinaryExpression)exp; item.Operator = " < "; this.Rosolve(bexp.Left, item, indexContent, IsValue); this.Rosolve(bexp.Right, item, indexContent, true); break; case ExpressionType.LessThanOrEqual: bexp = (BinaryExpression)exp; item.Operator = " <= "; this.Rosolve(bexp.Left, item, indexContent, IsValue); this.Rosolve(bexp.Right, item, indexContent, true); break; case ExpressionType.GreaterThanOrEqual: bexp = (BinaryExpression)exp; item.Operator = " >= "; this.Rosolve(bexp.Left, item, indexContent, IsValue); this.Rosolve(bexp.Right, item, indexContent, true); break; case ExpressionType.GreaterThan: bexp = (BinaryExpression)exp; item.Operator = " > "; this.Rosolve(bexp.Left, item, indexContent, IsValue); this.Rosolve(bexp.Right, item, indexContent, true); break; case ExpressionType.Constant: this.GetConstantValue((ConstantExpression)exp, item); break; } }