Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlLiftWhereClauses.cs / 1305376 / 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
- SimpleHandlerBuildProvider.cs
- DataGridViewCellStyle.cs
- SqlUserDefinedAggregateAttribute.cs
- SemanticBasicElement.cs
- ClientRoleProvider.cs
- BitmapImage.cs
- WindowsComboBox.cs
- TimelineCollection.cs
- DrawListViewColumnHeaderEventArgs.cs
- FixedFindEngine.cs
- SoundPlayer.cs
- CachedPathData.cs
- EditorPartChrome.cs
- SimpleType.cs
- DataTableTypeConverter.cs
- UserPreferenceChangedEventArgs.cs
- DesignerValidatorAdapter.cs
- File.cs
- HtmlDocument.cs
- EmptyCollection.cs
- ProcessModelSection.cs
- XmlSchemaAnnotated.cs
- TableRowCollection.cs
- WebExceptionStatus.cs
- NavigatorOutput.cs
- MobileResource.cs
- CategoryNameCollection.cs
- StagingAreaInputItem.cs
- ColumnHeader.cs
- EndpointDiscoveryBehavior.cs
- XmlSchemaAttributeGroupRef.cs
- AlternationConverter.cs
- UserPreferenceChangedEventArgs.cs
- ButtonPopupAdapter.cs
- DataGridViewCellContextMenuStripNeededEventArgs.cs
- FixedSOMFixedBlock.cs
- CorrelationScope.cs
- ComponentChangingEvent.cs
- XmlSerializerFactory.cs
- CapabilitiesSection.cs
- BaseDataBoundControl.cs
- AutomationIdentifierGuids.cs
- TextTreeExtractElementUndoUnit.cs
- Emitter.cs
- SecurityPermission.cs
- DataServiceHost.cs
- ToolBar.cs
- WebBrowserContainer.cs
- Panel.cs
- StructuredTypeEmitter.cs
- UriTemplateLiteralPathSegment.cs
- ProxyManager.cs
- ProcessingInstructionAction.cs
- WebConfigurationManager.cs
- SessionStateItemCollection.cs
- ThumbAutomationPeer.cs
- MaskInputRejectedEventArgs.cs
- TextContainerHelper.cs
- Buffer.cs
- SendKeys.cs
- ChoiceConverter.cs
- QuaternionAnimation.cs
- AssemblyBuilder.cs
- RotateTransform3D.cs
- RestHandler.cs
- MaskedTextBox.cs
- CommandHelpers.cs
- NTAccount.cs
- VirtualPathProvider.cs
- DataBoundControlHelper.cs
- GridItemPattern.cs
- ScriptHandlerFactory.cs
- SqlCommandSet.cs
- AxisAngleRotation3D.cs
- ContainerVisual.cs
- DbConvert.cs
- BridgeDataReader.cs
- EventMappingSettings.cs
- TextBox.cs
- XmlSchemaComplexContentRestriction.cs
- UserControlAutomationPeer.cs
- EnlistmentState.cs
- SharingService.cs
- SchemaDeclBase.cs
- DurableInstancingOptions.cs
- StylusButton.cs
- PreviewKeyDownEventArgs.cs
- WebPartConnectVerb.cs
- HwndSource.cs
- ProtocolElement.cs
- ContentWrapperAttribute.cs
- UserControl.cs
- _FtpDataStream.cs
- ShaderRenderModeValidation.cs
- Inflater.cs
- WorkflowOwnerAsyncResult.cs
- loginstatus.cs
- UInt32.cs
- LocatorGroup.cs
- StreamWithDictionary.cs