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); }
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)); }