コード例 #1
0
 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());
 }
コード例 #2
0
 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());
 }
コード例 #3
0
 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());
 }
コード例 #4
0
 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());
 }
コード例 #5
0
 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));
 }
コード例 #6
0
        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());
        }