Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Common / CommandTrees / Internal / ExpressionReplacer.cs / 2 / ExpressionReplacer.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Diagnostics; using System.Data.Metadata.Edm; using System.Data.Common.CommandTrees; namespace System.Data.Common.CommandTrees.Internal { internal class ExpressionReplacement { private DbExpression _toReplace; private DbExpression _replacement; private bool _visit; internal ExpressionReplacement() { } public DbExpression Current { get { return _toReplace; } internal set { _toReplace = value; } } public DbExpression Replacement { get { return _replacement; } set { // #487325 if (value == null) { throw EntityUtil.ArgumentNull("Replacement"); } _replacement = value; } } public bool VisitReplacement { get { return _visit; } set { _visit = value; } } } internal delegate void ReplacerCallback(ExpressionReplacement replacement); ////// Replaces Expressions according to a given callback /// internal class ExpressionReplacer : DbExpressionVisitor{ private ReplacerCallback _replacer; private ExpressionReplacement _replacement = new ExpressionReplacement(); internal ExpressionReplacer(ReplacerCallback replacer) { _replacer = replacer; } internal DbExpression Replace(DbExpression toReplace) { return toReplace.Accept (this); } internal void ReplaceBinding(DbExpressionBinding binding) { DbExpression newExpr = this.Replace(binding.Expression); if (!object.ReferenceEquals(newExpr, binding.Expression)) { binding.Expression = newExpr; } } #region Private Implementation /// /// Handles the logic of invoking the replacement callback, inspecting the result, and recursing into the new expression if necessary. /// This method is guaranteed to return either the original expression or the replaced expression as the value of the out parameter /// (i.e. will never return null) with the Boolean return value indicating whether or not replacement actually took place. /// /// The DbExpression to potentially replace /// Either the original DbExpression or the DbExpression that the replacement callback replaced the original DbExpression with ///True if the original DbExpression was replaced and the result is the new DbExpression; false otherwise (in which case result is the original DbExpression) private bool DoReplacement(DbExpression original, out DbExpression result) { result = original; _replacement.Current = original; _replacement.Replacement = original; _replacement.VisitReplacement = true; _replacer(_replacement); if (!object.ReferenceEquals(_replacement.Current, _replacement.Replacement)) { if (_replacement.VisitReplacement) { result = this.Replace(_replacement.Replacement); } else { result = _replacement.Replacement; } return true; } return false; } private DbExpression ReplaceTerminal(DbExpression e) { DbExpression retExpr = null; DoReplacement(e, out retExpr); return retExpr; } private DbExpression ReplaceUnary(DbUnaryExpression e) { DbExpression retExpr = null; if (DoReplacement(e, out retExpr)) { return retExpr; } DbExpression argExpr = this.Replace(e.Argument); if (!object.ReferenceEquals(argExpr, e.Argument)) { e.Argument = argExpr; } return e; } private DbExpression ReplaceBinary(DbBinaryExpression e) { DbExpression retExpr = null; if (DoReplacement(e, out retExpr)) { return retExpr; } DbExpression argExpr = this.Replace(e.Left); if (!object.ReferenceEquals(argExpr, e.Left)) { e.Left = argExpr; } argExpr = this.Replace(e.Right); if (!object.ReferenceEquals(argExpr, e.Right)) { e.Right = argExpr; } return e; } private void ReplaceList(IListlist) { for (int idx = 0; idx < list.Count; idx++) { DbExpression newExpr = this.Replace(list[idx]); if (!object.ReferenceEquals(newExpr, list[idx])) { #if MUTABLE_CQT list[idx] = newExpr; #else ExpressionList exprList = list as ExpressionList; if (exprList != null) { exprList.SetAt(idx, newExpr); } else { list[idx] = newExpr; } #endif } } } private void ReplaceBinding(DbGroupExpressionBinding binding) { DbExpression newExpr = this.Replace(binding.Expression); if (!object.ReferenceEquals(newExpr, binding.Expression)) { binding.Expression = newExpr; } } #endregion #region DbExpressionVisitor Members public override DbExpression Visit(DbExpression e) { throw EntityUtil.NotSupported(System.Data.Entity.Strings.Cqt_General_UnsupportedExpression(e.GetType().FullName)); } public override DbExpression Visit(DbConstantExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbNullExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbVariableReferenceExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbParameterReferenceExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbFunctionExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.Arguments); if (e.IsLambda) { Debug.Assert(e.LambdaBody != null, "DbFunctionExpression.IsLambda returned true when LambdaBody == null"); DbExpression newBody = this.Replace(e.LambdaBody); if (!object.ReferenceEquals(newBody, e.LambdaBody)) { e.LambdaBody = newBody; } } return e; } #if METHOD_EXPRESSION public override Expression Visit(MethodExpression e) { Expression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.Arguments); if (e.Instance != null) { Expression newInst = this.Replace(e.Instance); if (!object.ReferenceEquals(newInst, e.Instance)) { e.Instance = newInst; } } return e; } #endif public override DbExpression Visit(DbPropertyExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } if (e.Instance != null) { DbExpression newInst = this.Replace(e.Instance); if (!object.ReferenceEquals(newInst, e.Instance)) { e.Instance = newInst; } } return e; } public override DbExpression Visit(DbComparisonExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbLikeExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } DbExpression argExpr = this.Replace(e.Argument); if (!object.ReferenceEquals(argExpr, e.Argument)) { e.Argument = argExpr; } argExpr = this.Replace(e.Pattern); if (!object.ReferenceEquals(argExpr, e.Pattern)) { e.Pattern = argExpr; } argExpr = this.Replace(e.Escape); if (!object.ReferenceEquals(argExpr, e.Escape)) { e.Escape = argExpr; } return e; } public override DbExpression Visit(DbLimitExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } DbExpression argExpr = this.Replace(e.Argument); if (!object.ReferenceEquals(argExpr, e.Argument)) { e.Argument = argExpr; } argExpr = this.Replace(e.Limit); if (!object.ReferenceEquals(argExpr, e.Limit)) { e.Limit = argExpr; } return e; } public override DbExpression Visit(DbIsNullExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbArithmeticExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.Arguments); return e; } public override DbExpression Visit(DbAndExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbOrExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbNotExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbDistinctExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbElementExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbIsEmptyExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbUnionAllExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbIntersectExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbExceptExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbTreatExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbIsOfExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbCastExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbCaseExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.When); ReplaceList(e.Then); newExpr = this.Replace(e.Else); if (!object.ReferenceEquals(newExpr, e.Else)) { e.Else = newExpr; } return e; } public override DbExpression Visit(DbOfTypeExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbNewInstanceExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.Arguments); if (e.HasRelatedEntityReferences) { foreach(DbRelatedEntityRef relatedRef in e.RelatedEntityReferences) { DbExpression newTargetRef = this.Replace(relatedRef.TargetEntityReference); if (!object.ReferenceEquals(newTargetRef, relatedRef.TargetEntityReference)) { relatedRef.TargetEntityReference = newTargetRef; } } } return e; } public override DbExpression Visit(DbRefExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbRelationshipNavigationExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } DbExpression argExpr = this.Replace(e.NavigationSource); if (!object.ReferenceEquals(argExpr, e.NavigationSource)) { e.NavigationSource = argExpr; } return e; } public override DbExpression Visit(DbDerefExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbRefKeyExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbEntityRefExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbScanExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbFilterExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); DbExpression predExpr = this.Replace(e.Predicate); if (!object.ReferenceEquals(predExpr, e.Predicate)) { e.Predicate = predExpr; } return e; } public override DbExpression Visit(DbProjectExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); DbExpression projExpr = this.Replace(e.Projection); if (!object.ReferenceEquals(projExpr, e.Projection)) { e.Projection = projExpr; } return e; } public override DbExpression Visit(DbCrossJoinExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } foreach (DbExpressionBinding input in e.Inputs) { ReplaceBinding(input); } return e; } public override DbExpression Visit(DbJoinExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Left); ReplaceBinding(e.Right); DbExpression condExpr = this.Replace(e.JoinCondition); if (!object.ReferenceEquals(condExpr, e.JoinCondition)) { e.JoinCondition = condExpr; } return e; } public override DbExpression Visit(DbApplyExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); ReplaceBinding(e.Apply); return e; } public override DbExpression Visit(DbGroupByExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); ReplaceList(e.Keys); foreach (DbAggregate agg in e.Aggregates) { ReplaceList(agg.Arguments); } return e; } private void ReplaceSortKeys(IList keys) { foreach (DbSortClause sortClause in keys) { DbExpression keyExpr = this.Replace(sortClause.Expression); if (!object.ReferenceEquals(keyExpr, sortClause.Expression)) { sortClause.Expression = keyExpr; } } } public override DbExpression Visit(DbSkipExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); ReplaceSortKeys(e.SortOrder); DbExpression countExpr = this.Replace(e.Count); if (!object.ReferenceEquals(countExpr, e.Count)) { e.Count = countExpr; } return e; } public override DbExpression Visit(DbSortExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); ReplaceSortKeys(e.SortOrder); return e; } public override DbExpression Visit(DbQuantifierExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); DbExpression predExpr = this.Replace(e.Predicate); if (!object.ReferenceEquals(predExpr, e.Predicate)) { e.Predicate = predExpr; } return e; } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....], [....] //--------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Diagnostics; using System.Data.Metadata.Edm; using System.Data.Common.CommandTrees; namespace System.Data.Common.CommandTrees.Internal { internal class ExpressionReplacement { private DbExpression _toReplace; private DbExpression _replacement; private bool _visit; internal ExpressionReplacement() { } public DbExpression Current { get { return _toReplace; } internal set { _toReplace = value; } } public DbExpression Replacement { get { return _replacement; } set { // #487325 if (value == null) { throw EntityUtil.ArgumentNull("Replacement"); } _replacement = value; } } public bool VisitReplacement { get { return _visit; } set { _visit = value; } } } internal delegate void ReplacerCallback(ExpressionReplacement replacement); ////// Replaces Expressions according to a given callback /// internal class ExpressionReplacer : DbExpressionVisitor{ private ReplacerCallback _replacer; private ExpressionReplacement _replacement = new ExpressionReplacement(); internal ExpressionReplacer(ReplacerCallback replacer) { _replacer = replacer; } internal DbExpression Replace(DbExpression toReplace) { return toReplace.Accept (this); } internal void ReplaceBinding(DbExpressionBinding binding) { DbExpression newExpr = this.Replace(binding.Expression); if (!object.ReferenceEquals(newExpr, binding.Expression)) { binding.Expression = newExpr; } } #region Private Implementation /// /// Handles the logic of invoking the replacement callback, inspecting the result, and recursing into the new expression if necessary. /// This method is guaranteed to return either the original expression or the replaced expression as the value of the out parameter /// (i.e. will never return null) with the Boolean return value indicating whether or not replacement actually took place. /// /// The DbExpression to potentially replace /// Either the original DbExpression or the DbExpression that the replacement callback replaced the original DbExpression with ///True if the original DbExpression was replaced and the result is the new DbExpression; false otherwise (in which case result is the original DbExpression) private bool DoReplacement(DbExpression original, out DbExpression result) { result = original; _replacement.Current = original; _replacement.Replacement = original; _replacement.VisitReplacement = true; _replacer(_replacement); if (!object.ReferenceEquals(_replacement.Current, _replacement.Replacement)) { if (_replacement.VisitReplacement) { result = this.Replace(_replacement.Replacement); } else { result = _replacement.Replacement; } return true; } return false; } private DbExpression ReplaceTerminal(DbExpression e) { DbExpression retExpr = null; DoReplacement(e, out retExpr); return retExpr; } private DbExpression ReplaceUnary(DbUnaryExpression e) { DbExpression retExpr = null; if (DoReplacement(e, out retExpr)) { return retExpr; } DbExpression argExpr = this.Replace(e.Argument); if (!object.ReferenceEquals(argExpr, e.Argument)) { e.Argument = argExpr; } return e; } private DbExpression ReplaceBinary(DbBinaryExpression e) { DbExpression retExpr = null; if (DoReplacement(e, out retExpr)) { return retExpr; } DbExpression argExpr = this.Replace(e.Left); if (!object.ReferenceEquals(argExpr, e.Left)) { e.Left = argExpr; } argExpr = this.Replace(e.Right); if (!object.ReferenceEquals(argExpr, e.Right)) { e.Right = argExpr; } return e; } private void ReplaceList(IListlist) { for (int idx = 0; idx < list.Count; idx++) { DbExpression newExpr = this.Replace(list[idx]); if (!object.ReferenceEquals(newExpr, list[idx])) { #if MUTABLE_CQT list[idx] = newExpr; #else ExpressionList exprList = list as ExpressionList; if (exprList != null) { exprList.SetAt(idx, newExpr); } else { list[idx] = newExpr; } #endif } } } private void ReplaceBinding(DbGroupExpressionBinding binding) { DbExpression newExpr = this.Replace(binding.Expression); if (!object.ReferenceEquals(newExpr, binding.Expression)) { binding.Expression = newExpr; } } #endregion #region DbExpressionVisitor Members public override DbExpression Visit(DbExpression e) { throw EntityUtil.NotSupported(System.Data.Entity.Strings.Cqt_General_UnsupportedExpression(e.GetType().FullName)); } public override DbExpression Visit(DbConstantExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbNullExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbVariableReferenceExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbParameterReferenceExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbFunctionExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.Arguments); if (e.IsLambda) { Debug.Assert(e.LambdaBody != null, "DbFunctionExpression.IsLambda returned true when LambdaBody == null"); DbExpression newBody = this.Replace(e.LambdaBody); if (!object.ReferenceEquals(newBody, e.LambdaBody)) { e.LambdaBody = newBody; } } return e; } #if METHOD_EXPRESSION public override Expression Visit(MethodExpression e) { Expression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.Arguments); if (e.Instance != null) { Expression newInst = this.Replace(e.Instance); if (!object.ReferenceEquals(newInst, e.Instance)) { e.Instance = newInst; } } return e; } #endif public override DbExpression Visit(DbPropertyExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } if (e.Instance != null) { DbExpression newInst = this.Replace(e.Instance); if (!object.ReferenceEquals(newInst, e.Instance)) { e.Instance = newInst; } } return e; } public override DbExpression Visit(DbComparisonExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbLikeExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } DbExpression argExpr = this.Replace(e.Argument); if (!object.ReferenceEquals(argExpr, e.Argument)) { e.Argument = argExpr; } argExpr = this.Replace(e.Pattern); if (!object.ReferenceEquals(argExpr, e.Pattern)) { e.Pattern = argExpr; } argExpr = this.Replace(e.Escape); if (!object.ReferenceEquals(argExpr, e.Escape)) { e.Escape = argExpr; } return e; } public override DbExpression Visit(DbLimitExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } DbExpression argExpr = this.Replace(e.Argument); if (!object.ReferenceEquals(argExpr, e.Argument)) { e.Argument = argExpr; } argExpr = this.Replace(e.Limit); if (!object.ReferenceEquals(argExpr, e.Limit)) { e.Limit = argExpr; } return e; } public override DbExpression Visit(DbIsNullExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbArithmeticExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.Arguments); return e; } public override DbExpression Visit(DbAndExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbOrExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbNotExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbDistinctExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbElementExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbIsEmptyExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbUnionAllExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbIntersectExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbExceptExpression e) { return ReplaceBinary(e); } public override DbExpression Visit(DbTreatExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbIsOfExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbCastExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbCaseExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.When); ReplaceList(e.Then); newExpr = this.Replace(e.Else); if (!object.ReferenceEquals(newExpr, e.Else)) { e.Else = newExpr; } return e; } public override DbExpression Visit(DbOfTypeExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbNewInstanceExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceList(e.Arguments); if (e.HasRelatedEntityReferences) { foreach(DbRelatedEntityRef relatedRef in e.RelatedEntityReferences) { DbExpression newTargetRef = this.Replace(relatedRef.TargetEntityReference); if (!object.ReferenceEquals(newTargetRef, relatedRef.TargetEntityReference)) { relatedRef.TargetEntityReference = newTargetRef; } } } return e; } public override DbExpression Visit(DbRefExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbRelationshipNavigationExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } DbExpression argExpr = this.Replace(e.NavigationSource); if (!object.ReferenceEquals(argExpr, e.NavigationSource)) { e.NavigationSource = argExpr; } return e; } public override DbExpression Visit(DbDerefExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbRefKeyExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbEntityRefExpression e) { return ReplaceUnary(e); } public override DbExpression Visit(DbScanExpression e) { return ReplaceTerminal(e); } public override DbExpression Visit(DbFilterExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); DbExpression predExpr = this.Replace(e.Predicate); if (!object.ReferenceEquals(predExpr, e.Predicate)) { e.Predicate = predExpr; } return e; } public override DbExpression Visit(DbProjectExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); DbExpression projExpr = this.Replace(e.Projection); if (!object.ReferenceEquals(projExpr, e.Projection)) { e.Projection = projExpr; } return e; } public override DbExpression Visit(DbCrossJoinExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } foreach (DbExpressionBinding input in e.Inputs) { ReplaceBinding(input); } return e; } public override DbExpression Visit(DbJoinExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Left); ReplaceBinding(e.Right); DbExpression condExpr = this.Replace(e.JoinCondition); if (!object.ReferenceEquals(condExpr, e.JoinCondition)) { e.JoinCondition = condExpr; } return e; } public override DbExpression Visit(DbApplyExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); ReplaceBinding(e.Apply); return e; } public override DbExpression Visit(DbGroupByExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); ReplaceList(e.Keys); foreach (DbAggregate agg in e.Aggregates) { ReplaceList(agg.Arguments); } return e; } private void ReplaceSortKeys(IList keys) { foreach (DbSortClause sortClause in keys) { DbExpression keyExpr = this.Replace(sortClause.Expression); if (!object.ReferenceEquals(keyExpr, sortClause.Expression)) { sortClause.Expression = keyExpr; } } } public override DbExpression Visit(DbSkipExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); ReplaceSortKeys(e.SortOrder); DbExpression countExpr = this.Replace(e.Count); if (!object.ReferenceEquals(countExpr, e.Count)) { e.Count = countExpr; } return e; } public override DbExpression Visit(DbSortExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); ReplaceSortKeys(e.SortOrder); return e; } public override DbExpression Visit(DbQuantifierExpression e) { DbExpression newExpr = null; if (DoReplacement(e, out newExpr)) { return newExpr; } ReplaceBinding(e.Input); DbExpression predExpr = this.Replace(e.Predicate); if (!object.ReferenceEquals(predExpr, e.Predicate)) { e.Predicate = predExpr; } return e; } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- View.cs
- ButtonRenderer.cs
- GraphicsPath.cs
- PackageDigitalSignatureManager.cs
- ReferencedCollectionType.cs
- DrawingAttributesDefaultValueFactory.cs
- CombinedTcpChannel.cs
- TrackingQueryElement.cs
- RSAPKCS1SignatureDeformatter.cs
- ListBindableAttribute.cs
- Vector3DAnimation.cs
- OdbcConnectionHandle.cs
- GenericAuthenticationEventArgs.cs
- XMLDiffLoader.cs
- BuildManager.cs
- DiscreteKeyFrames.cs
- PropertyChangeTracker.cs
- _ConnectOverlappedAsyncResult.cs
- DataGridItemAutomationPeer.cs
- ResourceKey.cs
- MediaElementAutomationPeer.cs
- CodeAttributeDeclarationCollection.cs
- DataGridTableCollection.cs
- ConfigsHelper.cs
- X509Chain.cs
- SegmentTree.cs
- CellRelation.cs
- TypeBrowser.xaml.cs
- BaseTemplateBuildProvider.cs
- CachedFontFace.cs
- GridItemCollection.cs
- ExceptionList.cs
- TrustLevel.cs
- XmlValidatingReader.cs
- __TransparentProxy.cs
- ObjectDataSourceFilteringEventArgs.cs
- XmlSchemaGroupRef.cs
- InkCanvasAutomationPeer.cs
- ArrayTypeMismatchException.cs
- GestureRecognitionResult.cs
- BulletedListDesigner.cs
- RegionData.cs
- Compiler.cs
- DataServiceRequest.cs
- Bidi.cs
- XmlSchemaComplexContent.cs
- StaticExtension.cs
- MainMenu.cs
- HtmlLink.cs
- OleDbFactory.cs
- GradientStopCollection.cs
- ReferenceConverter.cs
- CodeDefaultValueExpression.cs
- MatchAttribute.cs
- ActivityLocationReferenceEnvironment.cs
- EntityType.cs
- MaterialGroup.cs
- DetailsViewDeletedEventArgs.cs
- UpdatableGenericsFeature.cs
- MessageBodyDescription.cs
- DataSourceView.cs
- ServiceBehaviorAttribute.cs
- GenericsNotImplementedException.cs
- TextSpan.cs
- StopRoutingHandler.cs
- ShapingEngine.cs
- SequentialUshortCollection.cs
- ColorConverter.cs
- CodePageEncoding.cs
- Block.cs
- ObjectItemAttributeAssemblyLoader.cs
- DES.cs
- NumberSubstitution.cs
- RequestCacheEntry.cs
- DefaultValueAttribute.cs
- ToolStripContentPanelDesigner.cs
- XmlSerializerFactory.cs
- ApplicationFileCodeDomTreeGenerator.cs
- OdbcConnection.cs
- SqlCacheDependencySection.cs
- NativeMethods.cs
- SerialPinChanges.cs
- ToolStripDropDownButton.cs
- PropertyManager.cs
- SessionStateModule.cs
- FrameworkElementAutomationPeer.cs
- DataGridViewTextBoxEditingControl.cs
- WSTrustDec2005.cs
- ComponentSerializationService.cs
- EntityTypeEmitter.cs
- ExtractorMetadata.cs
- DataFormats.cs
- ObjectQueryState.cs
- NativeMethods.cs
- ServiceOperationListItem.cs
- SemanticResultValue.cs
- webbrowsersite.cs
- ToolStrip.cs
- TreeNodeSelectionProcessor.cs
- BasicExpressionVisitor.cs