Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Common / CommandTrees / Internal / ExpressionReplacer.cs / 3 / 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
- X509CertificateValidator.cs
- StyleCollectionEditor.cs
- CodeGen.cs
- SoapAttributeAttribute.cs
- ProxyRpc.cs
- DetailsViewDeleteEventArgs.cs
- CodeParameterDeclarationExpression.cs
- LazyInitializer.cs
- CodeObject.cs
- ExecutionContext.cs
- SourceCollection.cs
- NativeMethods.cs
- LowerCaseStringConverter.cs
- TextRangeEditTables.cs
- MetadataItem_Static.cs
- BitmapSourceSafeMILHandle.cs
- XmlSchemaValidator.cs
- Win32Native.cs
- ProcessInfo.cs
- LinqDataSourceUpdateEventArgs.cs
- BaseValidator.cs
- LocalizationComments.cs
- MaterialGroup.cs
- CollectionChangedEventManager.cs
- PropertyValueChangedEvent.cs
- MenuAdapter.cs
- ReachFixedPageSerializer.cs
- PointF.cs
- SourceFileInfo.cs
- PackageRelationship.cs
- DataGridDetailsPresenter.cs
- FlatButtonAppearance.cs
- parserscommon.cs
- Nodes.cs
- SerializationFieldInfo.cs
- SqlCommandAsyncResult.cs
- BindingsSection.cs
- LinearGradientBrush.cs
- WindowsContainer.cs
- Rect3DConverter.cs
- TimelineGroup.cs
- NumberSubstitution.cs
- CompilerInfo.cs
- ConfigPathUtility.cs
- ListViewGroup.cs
- ArraySet.cs
- EventWaitHandle.cs
- DescendentsWalkerBase.cs
- DataGridViewIntLinkedList.cs
- XmlSchemaSimpleType.cs
- TrustLevel.cs
- SingleStorage.cs
- _DomainName.cs
- VirtualDirectoryMappingCollection.cs
- LocationSectionRecord.cs
- IndentedWriter.cs
- RewritingSimplifier.cs
- CompModSwitches.cs
- If.cs
- Image.cs
- RangeBase.cs
- EntityTransaction.cs
- FileVersionInfo.cs
- ToolStripButton.cs
- securitymgrsite.cs
- MdImport.cs
- OracleCommandSet.cs
- SerializationSectionGroup.cs
- ReflectionHelper.cs
- ProcessStartInfo.cs
- WebPartTransformerCollection.cs
- SqlCommandSet.cs
- XamlStream.cs
- ViewStateException.cs
- DataGridViewLayoutData.cs
- HyperLinkColumn.cs
- XslNumber.cs
- PrintDialog.cs
- XmlComment.cs
- ContentType.cs
- ListViewItemMouseHoverEvent.cs
- FileDialogCustomPlace.cs
- VisualStyleRenderer.cs
- DrawingCollection.cs
- EntityDataSourceUtil.cs
- SplitterDesigner.cs
- GetRecipientListRequest.cs
- ReferentialConstraint.cs
- BitmapDownload.cs
- SimplePropertyEntry.cs
- DataBindingCollection.cs
- RoutedCommand.cs
- DragDeltaEventArgs.cs
- ClientTargetSection.cs
- DataObjectSettingDataEventArgs.cs
- X509Extension.cs
- CompiledQuery.cs
- RealProxy.cs
- PageCatalogPart.cs
- ActiveXContainer.cs