コード例 #1
0
 protected override Expression VisitConstant(ConstantExpression node)
 {
     if (node.Value is ITable)
     {
         var table = (node.Value as ITable);
         TableName = table.GetTableName();
         AllowFiltering = table.GetEntityType().GetCustomAttributes(typeof(AllowFilteringAttribute), false).Any();
         
         var props = table.GetEntityType().GetPropertiesOrFields();
         foreach (var prop in props)
         {
             var memName = CqlQueryTools.CalculateMemberName(prop);
             Alter[prop.Name] = memName;
         }
         return node;
     }
     else if (phasePhase.get() == ParsePhase.Condition)
     {
         WhereClause.Append(node.Value.Encode());
         return node;
     }
     else if (phasePhase.get() == ParsePhase.SelectBinding)
     {
         if (Alter.ContainsKey(currentBindingName.get()))
         {
             Mappings[currentBindingName.get()] = Tuple.Create(currentBindingName.get(), node.Value, Mappings.Count);
             SelectFields.Add(currentBindingName.get());
         }
         else
         {
             Mappings[currentBindingName.get()] = Tuple.Create<string, object, int>(null, node.Value, Mappings.Count);
         }
         return node;
     }
     else if (phasePhase.get() == ParsePhase.Take)
     {
         Limit = (int)node.Value;
         return node;
     }
     else if (phasePhase.get() == ParsePhase.OrderBy || phasePhase.get() == ParsePhase.OrderByDescending)
     {
         OrderBy.Add(Alter[(string)node.Value].CqlIdentifier() + (phasePhase.get() == ParsePhase.OrderBy ? " ASC" : " DESC"));
         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]))
                         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());
 }
コード例 #3
0
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            if (node.Method.Name == "Select")
            {
                this.Visit(node.Arguments[0]);

                using (phasePhase.set(ParsePhase.What))
                    this.Visit(node.Arguments[1]);

                return(node);
            }
            else if (node.Method.Name == "Where")
            {
                this.Visit(node.Arguments[0]);

                using (phasePhase.set(ParsePhase.Condition))
                {
                    if (WhereClause.Length != 0)
                    {
                        WhereClause.Append(" AND ");
                    }
                    this.Visit(node.Arguments[1]);
                }
                return(node);
            }
            else if (node.Method.Name == "Take")
            {
                this.Visit(node.Arguments[0]);
                using (phasePhase.set(ParsePhase.Take))
                    this.Visit(node.Arguments[1]);
                return(node);
            }
            else if (node.Method.Name == "OrderBy" || node.Method.Name == "ThenBy")
            {
                this.Visit(node.Arguments[0]);
                using (phasePhase.set(ParsePhase.OrderBy))
                    this.Visit(node.Arguments[1]);
                return(node);
            }
            else if (node.Method.Name == "OrderByDescending" || node.Method.Name == "ThenByDescending")
            {
                this.Visit(node.Arguments[0]);
                using (phasePhase.set(ParsePhase.OrderByDescending))
                    this.Visit(node.Arguments[1]);
                return(node);
            }
            else if (node.Method.Name == "FirstOrDefault" || node.Method.Name == "First")
            {
                this.Visit(node.Arguments[0]);
                if (node.Arguments.Count == 3)
                {
                    using (phasePhase.set(ParsePhase.Condition))
                        this.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;
                    }
                    this.Visit(what);
                    WhereClause.Append(" IN (");
                    var  values = (IEnumerable)Expression.Lambda(inp).Compile().DynamicInvoke();
                    bool first  = false;
                    foreach (var obj in values)
                    {
                        if (!first)
                        {
                            first = true;
                        }
                        else
                        {
                            WhereClause.Append(", ");
                        }
                        WhereClause.Append(obj.Encode());
                    }
                    if (!first)
                    {
                        throw new CqlArgumentException("Collection " + inp.ToString() + " is empty.");
                    }
                    WhereClause.Append(")");
                    return(node);
                }
                else if (node.Method.Name == "CompareTo")
                {
                    this.Visit(node.Object);
                    WhereClause.Append(" " + binaryExpressionTag.get() + " ");
                    this.Visit(node.Arguments[0]);
                    return(node);
                }
                else if (node.Method.Name == "Equals")
                {
                    this.Visit(node.Object);
                    WhereClause.Append(" = ");
                    this.Visit(node.Arguments[0]);
                    return(node);
                }
                else if (node.Type.Name == "CqlToken")
                {
                    WhereClause.Append("token(");
                    var exprs = node.Arguments;
                    this.Visit(exprs.First());
                    foreach (var e in exprs.Skip(1))
                    {
                        WhereClause.Append(", ");
                        this.Visit(e);
                    }
                    WhereClause.Append(")");
                    return(node);
                }
                else
                {
                    var val = Expression.Lambda(node).Compile().DynamicInvoke();
                    WhereClause.Append(val.Encode());
                    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 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());
 }
コード例 #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());
        }