Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlLiftWhereClauses.cs / 1 / SqlLiftWhereClauses.cs
using System; using System.Collections.Generic; using System.Text; using System.Data.Linq.Mapping; using System.Data.Linq.Provider; namespace System.Data.Linq.SqlClient { ////// Hoist WHERE clauses as close to the root as possible. /// class SqlLiftWhereClauses { internal static SqlNode Lift(SqlNode node, TypeSystemProvider typeProvider, MetaModel model) { return new Lifter(typeProvider, model).Visit(node); } class Lifter : SqlVisitor { private class Scope { internal Scope Parent; internal SqlExpression Where; internal Scope(SqlExpression where, Scope parent) { this.Where = where; this.Parent = parent; } }; Scope current; SqlFactory sql; SqlAggregateChecker aggregateChecker; SqlRowNumberChecker rowNumberChecker; internal Lifter(TypeSystemProvider typeProvider, MetaModel model) { this.sql = new SqlFactory(typeProvider, model); this.aggregateChecker = new SqlAggregateChecker(); this.rowNumberChecker = new SqlRowNumberChecker(); } internal override SqlSelect VisitSelect(SqlSelect select) { Scope save = this.current; this.current = new Scope(select.Where, this.current); SqlSelect result = base.VisitSelect(select); bool stopHoisting = select.IsDistinct || select.GroupBy.Count > 0 || this.aggregateChecker.HasAggregates(select) || select.Top != null || this.rowNumberChecker.HasRowNumber(select); // Shift as much of the current WHERE to the parent as possible. if (this.current != null) { if (this.current.Parent != null && !stopHoisting) { this.current.Parent.Where = sql.AndAccumulate(this.current.Parent.Where, this.current.Where); this.current.Where = null; } select.Where = this.current.Where; } this.current = save; return result; } internal override SqlNode VisitUnion(SqlUnion su) { Scope save = this.current; this.current = null; SqlNode result = base.VisitUnion(su); this.current = save; return result; } internal override SqlSource VisitJoin(SqlJoin join) { // block where clauses from being lifted out of the cardinality-dependent // side of an outer join. Scope save = this.current; try { switch (join.JoinType) { case SqlJoinType.Cross: case SqlJoinType.CrossApply: case SqlJoinType.Inner: return base.VisitJoin(join); case SqlJoinType.LeftOuter: case SqlJoinType.OuterApply: { join.Left = this.VisitSource(join.Left); this.current = null; join.Right = this.VisitSource(join.Right); join.Condition = this.VisitExpression(join.Condition); return join; } default: this.current = null; return base.VisitJoin(join); } } finally { this.current = save; } } internal override SqlExpression VisitSubSelect(SqlSubSelect ss) { // block where clauses from being lifted out of a sub-query Scope save = this.current; this.current = null; SqlExpression result = base.VisitSubSelect(ss); this.current = save; return result; } internal override SqlExpression VisitClientQuery(SqlClientQuery cq) { // block where clauses from being lifted out of a client-materialized sub-query Scope save = this.current; this.current = null; SqlExpression result = base.VisitClientQuery(cq); this.current = save; return result; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections.Generic; using System.Text; using System.Data.Linq.Mapping; using System.Data.Linq.Provider; namespace System.Data.Linq.SqlClient { ////// Hoist WHERE clauses as close to the root as possible. /// class SqlLiftWhereClauses { internal static SqlNode Lift(SqlNode node, TypeSystemProvider typeProvider, MetaModel model) { return new Lifter(typeProvider, model).Visit(node); } class Lifter : SqlVisitor { private class Scope { internal Scope Parent; internal SqlExpression Where; internal Scope(SqlExpression where, Scope parent) { this.Where = where; this.Parent = parent; } }; Scope current; SqlFactory sql; SqlAggregateChecker aggregateChecker; SqlRowNumberChecker rowNumberChecker; internal Lifter(TypeSystemProvider typeProvider, MetaModel model) { this.sql = new SqlFactory(typeProvider, model); this.aggregateChecker = new SqlAggregateChecker(); this.rowNumberChecker = new SqlRowNumberChecker(); } internal override SqlSelect VisitSelect(SqlSelect select) { Scope save = this.current; this.current = new Scope(select.Where, this.current); SqlSelect result = base.VisitSelect(select); bool stopHoisting = select.IsDistinct || select.GroupBy.Count > 0 || this.aggregateChecker.HasAggregates(select) || select.Top != null || this.rowNumberChecker.HasRowNumber(select); // Shift as much of the current WHERE to the parent as possible. if (this.current != null) { if (this.current.Parent != null && !stopHoisting) { this.current.Parent.Where = sql.AndAccumulate(this.current.Parent.Where, this.current.Where); this.current.Where = null; } select.Where = this.current.Where; } this.current = save; return result; } internal override SqlNode VisitUnion(SqlUnion su) { Scope save = this.current; this.current = null; SqlNode result = base.VisitUnion(su); this.current = save; return result; } internal override SqlSource VisitJoin(SqlJoin join) { // block where clauses from being lifted out of the cardinality-dependent // side of an outer join. Scope save = this.current; try { switch (join.JoinType) { case SqlJoinType.Cross: case SqlJoinType.CrossApply: case SqlJoinType.Inner: return base.VisitJoin(join); case SqlJoinType.LeftOuter: case SqlJoinType.OuterApply: { join.Left = this.VisitSource(join.Left); this.current = null; join.Right = this.VisitSource(join.Right); join.Condition = this.VisitExpression(join.Condition); return join; } default: this.current = null; return base.VisitJoin(join); } } finally { this.current = save; } } internal override SqlExpression VisitSubSelect(SqlSubSelect ss) { // block where clauses from being lifted out of a sub-query Scope save = this.current; this.current = null; SqlExpression result = base.VisitSubSelect(ss); this.current = save; return result; } internal override SqlExpression VisitClientQuery(SqlClientQuery cq) { // block where clauses from being lifted out of a client-materialized sub-query Scope save = this.current; this.current = null; SqlExpression result = base.VisitClientQuery(cq); this.current = save; return result; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- IsolatedStoragePermission.cs
- SafeRegistryHandle.cs
- ClientRolePrincipal.cs
- TextBox.cs
- ScaleTransform.cs
- TextSelectionProcessor.cs
- PolicyManager.cs
- CodeTryCatchFinallyStatement.cs
- ConfigurationStrings.cs
- SingleSelectRootGridEntry.cs
- MissingFieldException.cs
- indexingfiltermarshaler.cs
- ArgIterator.cs
- OrderedEnumerableRowCollection.cs
- TextCompositionEventArgs.cs
- MetadataSource.cs
- MetadataItemCollectionFactory.cs
- ObjectTypeMapping.cs
- StateFinalizationActivity.cs
- EventlogProvider.cs
- SqlNodeAnnotations.cs
- SQLDateTime.cs
- SingleKeyFrameCollection.cs
- ToolBarButtonDesigner.cs
- PassportAuthenticationModule.cs
- UriTemplateClientFormatter.cs
- Delegate.cs
- MergePropertyDescriptor.cs
- FunctionQuery.cs
- EntityDataSourceEntityTypeFilterItem.cs
- StaticTextPointer.cs
- HiddenFieldDesigner.cs
- SoapBinding.cs
- OracleConnection.cs
- SiteMapProvider.cs
- NetMsmqSecurityMode.cs
- BindingMAnagerBase.cs
- CodeParameterDeclarationExpressionCollection.cs
- SqlStream.cs
- OledbConnectionStringbuilder.cs
- ResourceReferenceKeyNotFoundException.cs
- ChangeTracker.cs
- EntityViewContainer.cs
- odbcmetadatacolumnnames.cs
- RepeaterCommandEventArgs.cs
- AuthorizationRuleCollection.cs
- UrlPath.cs
- LiteralTextParser.cs
- CombinedGeometry.cs
- XmlDigitalSignatureProcessor.cs
- PolyLineSegmentFigureLogic.cs
- NonClientArea.cs
- IsolatedStoragePermission.cs
- IISUnsafeMethods.cs
- ImageSource.cs
- SuspendDesigner.cs
- ScalarOps.cs
- EdmPropertyAttribute.cs
- DataKeyCollection.cs
- EntityTransaction.cs
- NumericUpDownAcceleration.cs
- InputLanguageCollection.cs
- EndpointDiscoveryBehavior.cs
- PointAnimationBase.cs
- Registry.cs
- SqlNodeTypeOperators.cs
- DataGridColumnDropSeparator.cs
- TrustManagerMoreInformation.cs
- MobileUserControl.cs
- InternalBase.cs
- AnnouncementInnerClientCD1.cs
- FileDetails.cs
- TemplateManager.cs
- BoolExpr.cs
- ImageFormatConverter.cs
- ViewStateException.cs
- HtmlEncodedRawTextWriter.cs
- CodeSnippetCompileUnit.cs
- ValueUtilsSmi.cs
- BamlResourceDeserializer.cs
- UserMapPath.cs
- ParameterRetriever.cs
- X509SecurityToken.cs
- InheritanceRules.cs
- CircleEase.cs
- SafeIUnknown.cs
- DataGridViewAccessibleObject.cs
- WindowsToolbarAsMenu.cs
- DrawingGroupDrawingContext.cs
- RemotingServices.cs
- WindowCollection.cs
- FileDataSourceCache.cs
- QueryExtender.cs
- TreeNode.cs
- ToolStripContainer.cs
- InputManager.cs
- FixedStringLookup.cs
- RadioButton.cs
- DataGridViewColumnEventArgs.cs
- Pkcs7Signer.cs