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
- SqlVisitor.cs
- ValueTypeFixupInfo.cs
- PersistChildrenAttribute.cs
- DebuggerAttributes.cs
- ForeignConstraint.cs
- ExtendedPropertyCollection.cs
- SafeMemoryMappedViewHandle.cs
- TdsEnums.cs
- DirectoryNotFoundException.cs
- QueryableFilterRepeater.cs
- PathGeometry.cs
- CompositeCollectionView.cs
- CollaborationHelperFunctions.cs
- TemplateColumn.cs
- Quaternion.cs
- XmlTextReaderImpl.cs
- Pts.cs
- AnnotationMap.cs
- WCFServiceClientProxyGenerator.cs
- WebBrowserProgressChangedEventHandler.cs
- TemplateBindingExpressionConverter.cs
- RestClientProxyHandler.cs
- PathSegment.cs
- GatewayIPAddressInformationCollection.cs
- ConfigurationPropertyAttribute.cs
- remotingproxy.cs
- BufferBuilder.cs
- SerializationIncompleteException.cs
- ScrollViewer.cs
- WebHttpSecurityElement.cs
- ActionFrame.cs
- GenerateTemporaryAssemblyTask.cs
- AdapterUtil.cs
- ILGen.cs
- ToolZoneDesigner.cs
- MenuItemStyle.cs
- MenuCommandService.cs
- ListMarkerLine.cs
- SocketException.cs
- PrintController.cs
- SqlClientWrapperSmiStreamChars.cs
- PackageProperties.cs
- SplineKeyFrames.cs
- DataObject.cs
- HttpInputStream.cs
- _WinHttpWebProxyDataBuilder.cs
- Helpers.cs
- MultipartContentParser.cs
- WinFormsUtils.cs
- SystemMulticastIPAddressInformation.cs
- PersonalizationProvider.cs
- DrawingGroup.cs
- ProfileInfo.cs
- ListenerElementsCollection.cs
- ExtendedPropertiesHandler.cs
- ExpressionLink.cs
- ImportDesigner.xaml.cs
- AsymmetricSecurityProtocolFactory.cs
- XmlQueryOutput.cs
- x509utils.cs
- OverflowException.cs
- ThrowHelper.cs
- Hash.cs
- StoreContentChangedEventArgs.cs
- SqlRowUpdatedEvent.cs
- ResourceWriter.cs
- OracleParameterBinding.cs
- ExpressionLink.cs
- ViewStateChangedEventArgs.cs
- ToolStripContentPanel.cs
- QilNode.cs
- JsonEnumDataContract.cs
- WebServiceMethodData.cs
- ServiceOperation.cs
- BitmapEffectGroup.cs
- WSTransactionSection.cs
- Viewport3DVisual.cs
- EventSetterHandlerConverter.cs
- ContextMarshalException.cs
- Int32Animation.cs
- UpdatePanelTrigger.cs
- InvalidOleVariantTypeException.cs
- updatecommandorderer.cs
- AnimatedTypeHelpers.cs
- FontUnitConverter.cs
- ClientConfigurationHost.cs
- Margins.cs
- BitmapPalettes.cs
- Point4DValueSerializer.cs
- EpmCustomContentDeSerializer.cs
- List.cs
- HtmlFormWrapper.cs
- XmlMapping.cs
- ElementProxy.cs
- XmlSerializerSection.cs
- PositiveTimeSpanValidatorAttribute.cs
- MenuItem.cs
- TableLayoutPanelResizeGlyph.cs
- TdsParserSafeHandles.cs
- QuadraticEase.cs