Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- TransmissionStrategy.cs
- ConfigXmlCDataSection.cs
- SapiRecoContext.cs
- TemplateXamlTreeBuilder.cs
- DataSourceControl.cs
- SqlReferenceCollection.cs
- LongValidator.cs
- XmlEntityReference.cs
- EventRecordWrittenEventArgs.cs
- DbParameterHelper.cs
- MediaContextNotificationWindow.cs
- DateBoldEvent.cs
- VisualStyleRenderer.cs
- PageStatePersister.cs
- BitmapInitialize.cs
- PropertyReferenceSerializer.cs
- SqlCacheDependency.cs
- HebrewNumber.cs
- WebPartTransformerAttribute.cs
- SimpleHandlerFactory.cs
- xmlglyphRunInfo.cs
- JsonFormatReaderGenerator.cs
- DataGridViewRowHeightInfoNeededEventArgs.cs
- MobileUserControl.cs
- NotifyParentPropertyAttribute.cs
- documentsequencetextcontainer.cs
- ListenerPerfCounters.cs
- SqlRetyper.cs
- AnnotationComponentManager.cs
- BaseServiceProvider.cs
- QuotedPrintableStream.cs
- SqlMultiplexer.cs
- XmlUtil.cs
- FormViewModeEventArgs.cs
- KeyInstance.cs
- Misc.cs
- SimpleHandlerBuildProvider.cs
- ConnectionProviderAttribute.cs
- SerializableAttribute.cs
- SqlWorkflowPersistenceService.cs
- RankException.cs
- ErrorTableItemStyle.cs
- KeyInterop.cs
- ReadContentAsBinaryHelper.cs
- ViewValidator.cs
- CheckedPointers.cs
- BitmapEffectDrawingContextState.cs
- ParenthesizePropertyNameAttribute.cs
- ExternalFile.cs
- AsyncResult.cs
- Message.cs
- SelectionItemProviderWrapper.cs
- SqlMethods.cs
- MaskedTextBoxTextEditorDropDown.cs
- RightsDocument.cs
- Ticks.cs
- UnsafeNativeMethodsPenimc.cs
- PropertyToken.cs
- DataGridViewTextBoxEditingControl.cs
- KeyTime.cs
- MarshalByRefObject.cs
- ManagementPath.cs
- ButtonBase.cs
- WebPartConnectVerb.cs
- HostingEnvironment.cs
- DateTimeConverter.cs
- SocketInformation.cs
- WebConvert.cs
- OdbcEnvironment.cs
- TreeNodeMouseHoverEvent.cs
- CatalogZoneBase.cs
- AuthorizationRuleCollection.cs
- ReachPageContentSerializerAsync.cs
- SystemFonts.cs
- MetadataWorkspace.cs
- WebConfigurationManager.cs
- FormViewModeEventArgs.cs
- TextDecorationCollection.cs
- HTMLTagNameToTypeMapper.cs
- InternalTransaction.cs
- CodeVariableReferenceExpression.cs
- SortQueryOperator.cs
- WebPartMenuStyle.cs
- AspNetSynchronizationContext.cs
- WebBrowserNavigatingEventHandler.cs
- DocumentXPathNavigator.cs
- EndPoint.cs
- RSAPKCS1SignatureDeformatter.cs
- PartialCachingAttribute.cs
- MailDefinition.cs
- GenericFlowSwitchHelper.cs
- IsolatedStorageFileStream.cs
- PerformanceCounterLib.cs
- SQLInt32Storage.cs
- LabelLiteral.cs
- CommandEventArgs.cs
- StickyNoteContentControl.cs
- AccessibilityHelperForXpWin2k3.cs
- TableRow.cs
- NameValueCache.cs