protected override Expression VisitBinary(BinaryExpression node) { if (phasePhase.get() == ParsePhase.Condition) { if (CQLTags.ContainsKey(node.NodeType)) { if (IsCompareTo(node.Left)) { if (IsZero(node.Right)) { using (binaryExpressionTag.set(CQLTags[node.NodeType])) this.Visit(node.Left); return node; } } else if (IsCompareTo(node.Right)) { if (IsZero(node.Left)) { using (binaryExpressionTag.set(CQLTags[CQLInvTags[node.NodeType]])) this.Visit(node.Right); return node; } } else { this.Visit(node.Left); WhereClause.Append(" " + CQLTags[node.NodeType] + " "); this.Visit(node.Right); return node; } } } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitBinary(BinaryExpression node) { if (phasePhase.get() == ParsePhase.Condition) { if (CQLTags.ContainsKey(node.NodeType)) { if (IsCompareTo(node.Left)) { if (IsZero(node.Right)) { using (binaryExpressionTag.set(CQLTags[node.NodeType])) Visit(node.Left); return(node); } } else if (IsCompareTo(node.Right)) { if (IsZero(node.Left)) { using (binaryExpressionTag.set(CQLTags[CQLInvTags[node.NodeType]])) Visit(node.Right); return(node); } } else { Visit(DropNullableConversion(node.Left)); currentConditionBuilder.get().Append(" " + CQLTags[node.NodeType] + " "); Visit(DropNullableConversion(node.Right)); return(node); } } else if (!CQLUnsupTags.Contains(node.NodeType)) { object val = Expression.Lambda(node).Compile().DynamicInvoke(); currentConditionBuilder.get().Append(cqlTool.AddValue(val)); return(node); } } else if (phasePhase.get() == ParsePhase.SelectBinding) { object val = Expression.Lambda(node).Compile().DynamicInvoke(); if (Alter.ContainsKey(currentBindingName.get())) { Mappings[currentBindingName.get()] = Tuple.Create(currentBindingName.get(), val, Mappings.Count); SelectFields.Add(currentBindingName.get()); } else { Mappings[currentBindingName.get()] = Tuple.Create <string, object, int>(null, val, Mappings.Count); } return(node); } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitBinary(BinaryExpression node) { if (phasePhase.get() == ParsePhase.Condition) { if (CQLTags.ContainsKey(node.NodeType)) { if (IsCompareTo(node.Left)) { if (IsZero(node.Right)) { using (binaryExpressionTag.set(CQLTags[node.NodeType])) this.Visit(node.Left); return(node); } } else if (IsCompareTo(node.Right)) { if (IsZero(node.Left)) { using (binaryExpressionTag.set(CQLTags[CQLInvTags[node.NodeType]])) this.Visit(node.Right); return(node); } } else { this.Visit(node.Left); WhereClause.Append(" " + CQLTags[node.NodeType] + " "); this.Visit(node.Right); return(node); } } } else if (phasePhase.get() == ParsePhase.SelectBinding) { var val = Expression.Lambda(node).Compile().DynamicInvoke(); if (Alter.ContainsKey(currentBindingName.get())) { Mappings[currentBindingName.get()] = Tuple.Create(currentBindingName.get(), val, Mappings.Count); SelectFields.Add(currentBindingName.get()); } else { Mappings[currentBindingName.get()] = Tuple.Create <string, object, int>(null, val, Mappings.Count); } return(node); } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitMemberInit(MemberInitExpression node) { if (phasePhase.get() == ParsePhase.SelectBinding) { foreach (var binding in node.Bindings) { if (binding is MemberAssignment) { using (currentBindingName.set(binding.Member.Name)) this.Visit((binding as MemberAssignment).Expression); } } return(node); } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }
protected override Expression VisitLambda <T>(Expression <T> node) { if (phasePhase.get() == ParsePhase.What) { using (phasePhase.set(ParsePhase.SelectBinding)) using (currentBindingName.set(node.Parameters[0].Name)) Visit(node.Body); return(node); } return(base.VisitLambda(node)); }
protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Method.Name == "Select") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.What)) Visit(node.Arguments[1]); return(node); } if (node.Method.Name == "Where") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.Condition)) { if (WhereClause.Length != 0) { WhereClause.Append(" AND "); } Visit(node.Arguments[1]); } return(node); } if (node.Method.Name == "UpdateIf" || node.Method.Name == "DeleteIf") { this.Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.Condition)) { if (UpdateIfClause.Length != 0) { UpdateIfClause.Append(" AND "); } using (currentConditionBuilder.set(UpdateIfClause)) this.Visit(node.Arguments[1]); } return(node); } if (node.Method.Name == "Take") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.Take)) Visit(node.Arguments[1]); return(node); } if (node.Method.Name == "OrderBy" || node.Method.Name == "ThenBy") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.OrderBy)) Visit(node.Arguments[1]); return(node); } if (node.Method.Name == "OrderByDescending" || node.Method.Name == "ThenByDescending") { Visit(node.Arguments[0]); using (phasePhase.set(ParsePhase.OrderByDescending)) Visit(node.Arguments[1]); return(node); } if (node.Method.Name == "FirstOrDefault" || node.Method.Name == "First") { Visit(node.Arguments[0]); if (node.Arguments.Count == 3) { using (phasePhase.set(ParsePhase.Condition)) Visit(node.Arguments[2]); } Limit = 1; return(node); } if (phasePhase.get() == ParsePhase.Condition) { if (node.Method.Name == "Contains") { Expression what = null; Expression inp = null; if (node.Object == null) { what = node.Arguments[1]; inp = node.Arguments[0]; } else { what = node.Arguments[0]; inp = node.Object; } Visit(what); currentConditionBuilder.get().Append(" IN ("); var values = (IEnumerable)Expression.Lambda(inp).Compile().DynamicInvoke(); bool first = false; foreach (object obj in values) { if (!first) { first = true; } else { currentConditionBuilder.get().Append(", "); } currentConditionBuilder.get().Append(cqlTool.AddValue(obj)); } currentConditionBuilder.get().Append(")"); return(node); } if (node.Method.Name == "CompareTo") { Visit(node.Object); currentConditionBuilder.get().Append(" " + binaryExpressionTag.get() + " "); Visit(node.Arguments[0]); return(node); } if (node.Method.Name == "Equals") { Visit(node.Object); currentConditionBuilder.get().Append(" = "); Visit(node.Arguments[0]); return(node); } if (node.Type.Name == "CqlToken") { currentConditionBuilder.get().Append("token("); ReadOnlyCollection <Expression> exprs = node.Arguments; Visit(exprs.First()); foreach (Expression e in exprs.Skip(1)) { currentConditionBuilder.get().Append(", "); Visit(e); } currentConditionBuilder.get().Append(")"); return(node); } object val = Expression.Lambda(node).Compile().DynamicInvoke(); currentConditionBuilder.get().Append(cqlTool.AddValue(val)); return(node); } if (node.Method.Name == "AllowFiltering") { Visit(node.Arguments[0]); AllowFiltering = true; return(node); } throw new CqlLinqNotSupportedException(node, phasePhase.get()); }