protected override Expression VisitBinary(BinaryExpression node) { if (_parsePhase.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)); _currentCondition.Get().Item1.Append(" " + CqlTags[node.NodeType] + " "); Visit(DropNullableConversion(node.Right)); return(node); } } else if (!CqlUnsupTags.Contains(node.NodeType)) { var val = Expression.Lambda(node).Compile().DynamicInvoke(); _currentCondition.Get().Item2.Add(val); _currentCondition.Get().Item1.Append("?"); return(node); } } else if (_parsePhase.Get() == ParsePhase.SelectBinding) { var column = _pocoData.GetColumnByMemberName(_currentBindingName.Get()); if (column == null) { throw new ArgumentException("Trying to select a column does it excluded in the mappings"); } AddProjection(node, column); _selectFields.Add(column.ColumnName); return(node); } throw new CqlLinqNotSupportedException(node, _parsePhase.Get()); }
protected override Expression VisitLambda <T>(Expression <T> node) { if (_parsePhase.Get() != ParsePhase.Select) { return(base.VisitLambda(node)); } using (_parsePhase.Set(ParsePhase.SelectBinding)) { using (_currentBindingName.Set(node.Parameters[0].Name)) { Visit(node.Body); } } return(node); }
protected override Expression VisitMemberInit(MemberInitExpression node) { if (_parsePhase.Get() != ParsePhase.SelectBinding) { throw new CqlLinqNotSupportedException(node, _parsePhase.Get()); } foreach (var binding in node.Bindings) { if (!(binding is MemberAssignment)) { continue; } using (_currentBindingName.Set(binding.Member.Name)) { Visit((binding as MemberAssignment).Expression); } } return(node); }
protected override Expression VisitMethodCall(MethodCallExpression node) { var initialPhase = _parsePhase.Get(); switch (node.Method.Name) { case "Select": Visit(node.Arguments[0]); using (_parsePhase.Set(ParsePhase.Select)) { Visit(node.Arguments[1]); } return(node); case "Where": Visit(node.Arguments[0]); using (_parsePhase.Set(ParsePhase.Condition)) { if (_whereClause.Item1.Length != 0) { _whereClause.Item1.Append(" AND "); } Visit(node.Arguments[1]); } return(node); case "UpdateIf": case "DeleteIf": Visit(node.Arguments[0]); using (_parsePhase.Set(ParsePhase.Condition)) { if (_updateIfClause.Item1.Length != 0) { _updateIfClause.Item1.Append(" AND "); } using (_currentCondition.Set(_updateIfClause)) { Visit(node.Arguments[1]); } } return(node); case "Take": Visit(node.Arguments[0]); using (_parsePhase.Set(ParsePhase.Take)) { Visit(node.Arguments[1]); } return(node); case "GroupBy": Visit(node.Arguments[0]); using (_parsePhase.Set(ParsePhase.GroupBy)) { Visit(node.Arguments[1]); } return(node); case "OrderBy": case "ThenBy": Visit(node.Arguments[0]); using (_parsePhase.Set(ParsePhase.OrderBy)) { Visit(node.Arguments[1]); } return(node); case "OrderByDescending": case "ThenByDescending": Visit(node.Arguments[0]); using (_parsePhase.Set(ParsePhase.OrderByDescending)) { Visit(node.Arguments[1]); } return(node); case "FirstOrDefault": case "First": Visit(node.Arguments[0]); if (node.Arguments.Count == 3) { using (_parsePhase.Set(ParsePhase.Condition)) { Visit(node.Arguments[2]); } } _limit = 1; return(node); case "AllowFiltering": Visit(node.Arguments[0]); _allowFiltering = true; return(node); case "Min": case "Max": case "Average": case "Sum": case "Count": return(FillAggregate(initialPhase, node)); } if (initialPhase == ParsePhase.Condition) { return(EvaluateConditionFunction(node)); } if (initialPhase == ParsePhase.SelectBinding) { if (EvaluateOperatorMethod(node)) { //Applied operators and functions to UPDATE or SELECT statement return(node); } //Try to evaluate the expression return(AddProjection(node)); } throw new CqlLinqNotSupportedException(node, _parsePhase.Get()); }
protected override Expression VisitBinary(BinaryExpression node) { if (_parsePhase.Get() == ParsePhase.Condition) { var condition = _currentCondition.Get(); var clause = condition.Item1; var parameters = condition.Item2; 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 if (node.NodeType == ExpressionType.Equal && IsBoolMember(node.Left)) { // Handle x.prop == boolValue explicitly FillBooleanCondition((MemberExpression)node.Left, clause); Visit(node.Right); return(node); } else if (node.NodeType == ExpressionType.Equal && IsBoolMember(node.Right)) { // Handle boolValue == x.prop explicitly FillBooleanCondition((MemberExpression)node.Right, clause); Visit(node.Left); return(node); } else { Visit(DropNullableConversion(node.Left)); clause.Append(" " + CqlTags[node.NodeType] + " "); Visit(DropNullableConversion(node.Right)); return(node); } } else if (!CqlUnsupTags.Contains(node.NodeType)) { var val = Expression.Lambda(node).Compile().DynamicInvoke(); parameters.Add(val); clause.Append("?"); return(node); } } else if (_parsePhase.Get() == ParsePhase.SelectBinding) { var column = _pocoData.GetColumnByMemberName(_currentBindingName.Get()); if (column == null) { throw new ArgumentException("Trying to select a column does it excluded in the mappings"); } AddProjection(node, column); _selectFields.Add(column.ColumnName); return(node); } throw new CqlLinqNotSupportedException(node, _parsePhase.Get()); }