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());
 }
Esempio n. 2
0
 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);
 }
Esempio n. 3
0
 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());
        }