Ejemplo n.º 1
0
        protected Expression Visit(Expression exp)
        {
            Expression          expression;
            LinqToXmlTranslator linqToXmlTranslator = this;
            int mRecursionCount = linqToXmlTranslator.m_recursionCount;
            int num             = mRecursionCount;

            linqToXmlTranslator.m_recursionCount = mRecursionCount + 1;
            if (num > 100)
            {
                throw new XStoreArgumentException("Max number of LINQ expression recursive elements reached.");
            }
            try
            {
                if (exp == null)
                {
                    return(exp);
                }
                else
                {
                    switch (exp.NodeType)
                    {
                    case ExpressionType.Add:
                    case ExpressionType.AddChecked:
                    case ExpressionType.And:
                    case ExpressionType.AndAlso:
                    case ExpressionType.ArrayIndex:
                    case ExpressionType.Coalesce:
                    case ExpressionType.Divide:
                    case ExpressionType.Equal:
                    case ExpressionType.ExclusiveOr:
                    case ExpressionType.GreaterThan:
                    case ExpressionType.GreaterThanOrEqual:
                    case ExpressionType.LeftShift:
                    case ExpressionType.LessThan:
                    case ExpressionType.LessThanOrEqual:
                    case ExpressionType.Modulo:
                    case ExpressionType.Multiply:
                    case ExpressionType.MultiplyChecked:
                    case ExpressionType.NotEqual:
                    case ExpressionType.Or:
                    case ExpressionType.OrElse:
                    case ExpressionType.Power:
                    case ExpressionType.RightShift:
                    case ExpressionType.Subtract:
                    case ExpressionType.SubtractChecked:
                    {
                        expression = this.VisitBinary((BinaryExpression)exp);
                        break;
                    }

                    case ExpressionType.ArrayLength:
                    case ExpressionType.Convert:
                    case ExpressionType.ConvertChecked:
                    case ExpressionType.Negate:
                    case ExpressionType.UnaryPlus:
                    case ExpressionType.NegateChecked:
                    case ExpressionType.Not:
                    case ExpressionType.Quote:
                    case ExpressionType.TypeAs:
                    {
                        expression = this.VisitUnary((UnaryExpression)exp);
                        break;
                    }

                    case ExpressionType.Call:
                    {
                        expression = this.VisitMethodCall((MethodCallExpression)exp);
                        break;
                    }

                    case ExpressionType.Conditional:
                    case ExpressionType.Invoke:
                    case ExpressionType.ListInit:
                    case ExpressionType.New:
                    case ExpressionType.NewArrayInit:
                    case ExpressionType.NewArrayBounds:
                    case ExpressionType.Parameter:
                    {
                        throw new NotSupportedException(string.Format("NodeType {0} is not supported.", exp.NodeType.ToString()));
                    }

                    case ExpressionType.Constant:
                    {
                        expression = this.VisitConstant((ConstantExpression)exp);
                        break;
                    }

                    case ExpressionType.Lambda:
                    {
                        expression = this.VisitLambda((LambdaExpression)exp);
                        break;
                    }

                    case ExpressionType.MemberAccess:
                    {
                        expression = this.VisitMemberAccess((MemberExpression)exp);
                        break;
                    }

                    case ExpressionType.MemberInit:
                    {
                        expression = this.VisitMemberInit((MemberInitExpression)exp);
                        break;
                    }

                    default:
                    {
                        throw new NotSupportedException(string.Format("NodeType {0} is not supported.", exp.NodeType.ToString()));
                    }
                    }
                }
            }
            finally
            {
                this.m_recursionCount--;
            }
            return(expression);
        }
Ejemplo n.º 2
0
        public TResult Execute <TResult>(Expression expression)
        {
            PointQueryTracker pointQuery;

            if (this.CheckForReadPermission && this._context != null)
            {
                bool flag = TableResourceContainer.IsUtilityTables(this._userResourceName);
                this._context.CheckPermission(this._userResourceName, flag, true, UpdateKind.None);
            }
            if (TableResourceContainer.IsUtilityTables(this._userResourceName))
            {
                string str = null;
                if (this._context.ContinuationToken != null)
                {
                    this._context.ContinuationToken.TryGetValue("TableName", out str);
                }
                DevStoreTableQueryVisitor devStoreTableQueryVisitor = new DevStoreTableQueryVisitor(this._accountName, expression, str, TableDataContextHelper.MaxRowCount);
                devStoreTableQueryVisitor.TranslateQuery();
                if (this._context.IsBatchRequest && (!devStoreTableQueryVisitor.IsPointQuery.HasValue || !devStoreTableQueryVisitor.IsPointQuery.HasValue || !devStoreTableQueryVisitor.IsPointQuery.Value))
                {
                    throw new NotImplementedException();
                }
                string   str1              = devStoreTableQueryVisitor.SqlQuery.ToString();
                object[] array             = devStoreTableQueryVisitor.Parameters.ToArray();
                List <TableContainer> list = this._context.m_dbContext.ExecuteQuery <TableContainer>(str1, array).ToList <TableContainer>();
                if (devStoreTableQueryVisitor.TakeCount >= 0 && devStoreTableQueryVisitor.TakeCount < list.Count)
                {
                    TableContainer item = list[list.Count - 1];
                    this._context.ContinuationToken = new Dictionary <string, string>()
                    {
                        { "NextTableName", item.CasePreservedTableName }
                    };
                    this._context.ContinuationTokenAvailableCallback(this._context.ContinuationToken);
                    list.RemoveAt(list.Count - 1);
                }
                return((TResult)DbUtilityResourceBuilder.GetUtilityTableEnumerator(list.GetEnumerator()));
            }
            LinqToXmlTranslator linqToXmlTranslator = new LinqToXmlTranslator(this._accountName, this._userResourceName, expression, this._context.ContinuationToken, TableDataContextHelper.MaxRowCount, this._context.IsBatchRequest, this.SASKeyBounds);

            linqToXmlTranslator.TranslateQuery();
            if (linqToXmlTranslator.PointQuery.IsPointQuery)
            {
                pointQuery = linqToXmlTranslator.PointQuery;
            }
            else
            {
                pointQuery = null;
            }
            this.PointQuery = pointQuery;
            if (this._context.IsBatchRequest && this.PointQuery == null)
            {
                throw new NotSupportedException("We support retrieving only a single resource via a batch.");
            }
            string str2 = linqToXmlTranslator.XmlQuery.ToString();

            object[] objArray = (
                from ParameterRecord  in linqToXmlTranslator.Parameters
                select r.Value).ToArray <object>();
            List <TableRow> tableRows = this._context.m_dbContext.ExecuteQuery <TableRow>(str2, objArray).ToList <TableRow>();

            if (linqToXmlTranslator.TakeCount >= 0 && linqToXmlTranslator.TakeCount < tableRows.Count)
            {
                TableRow tableRow = tableRows[tableRows.Count - 1];
                this._context.ContinuationToken = new Dictionary <string, string>();
                this._context.ContinuationToken["NextPartitionKey"] = DevelopmentStorageDbDataContext.DecodeKeyString(tableRow.PartitionKey);
                this._context.ContinuationToken["NextRowKey"]       = DevelopmentStorageDbDataContext.DecodeKeyString(tableRow.RowKey);
                this._context.ContinuationTokenAvailableCallback(this._context.ContinuationToken);
                tableRows.RemoveAt(tableRows.Count - 1);
            }
            if (linqToXmlTranslator.ProjectedPropertyCount < 0)
            {
                return((TResult)DbUtilityResourceBuilder.GetUtilityRowEnumerator(tableRows.GetEnumerator()));
            }
            return((TResult)DbUtilityResourceBuilder.GetProjectedWrapperEnumerator(tableRows.GetEnumerator(), linqToXmlTranslator.ProjectedPropertyCount, linqToXmlTranslator.PropertyListName, this._userResourceName, linqToXmlTranslator.ProjectedProperties));
        }