Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- VideoDrawing.cs
- SourceChangedEventArgs.cs
- SchemaNames.cs
- DbConnectionPool.cs
- EncodingNLS.cs
- FocusManager.cs
- WebPartEventArgs.cs
- HideDisabledControlAdapter.cs
- UserPersonalizationStateInfo.cs
- AffineTransform3D.cs
- WebPartCollection.cs
- FileSystemEventArgs.cs
- Mouse.cs
- DocComment.cs
- XhtmlBasicLabelAdapter.cs
- DataContractSet.cs
- ColumnResizeUndoUnit.cs
- _NegoStream.cs
- JsonGlobals.cs
- ModelPerspective.cs
- ClonableStack.cs
- UserControlBuildProvider.cs
- TextView.cs
- SQLDecimalStorage.cs
- XmlSchemaNotation.cs
- HMACMD5.cs
- IsolatedStorage.cs
- AppDomainFactory.cs
- NullableDoubleSumAggregationOperator.cs
- UndoEngine.cs
- RIPEMD160.cs
- GridViewRowCollection.cs
- Geometry.cs
- HashAlgorithm.cs
- ObjectDataSourceStatusEventArgs.cs
- TimelineGroup.cs
- QueryContinueDragEvent.cs
- SystemEvents.cs
- KeyValueSerializer.cs
- Vector3D.cs
- BinaryConverter.cs
- DurableInstance.cs
- RightsController.cs
- FacetValueContainer.cs
- IdentityNotMappedException.cs
- ResourceWriter.cs
- RequestCachingSection.cs
- HttpProfileBase.cs
- SimpleTypesSurrogate.cs
- PngBitmapEncoder.cs
- MsmqInputChannelBase.cs
- ObjectComplexPropertyMapping.cs
- UnmanagedMemoryStreamWrapper.cs
- TextStore.cs
- _NetRes.cs
- NotFiniteNumberException.cs
- CodeTypeReferenceExpression.cs
- ComponentDispatcherThread.cs
- DataGridViewCellErrorTextNeededEventArgs.cs
- DataGridViewSortCompareEventArgs.cs
- WmpBitmapEncoder.cs
- Message.cs
- QuaternionConverter.cs
- Number.cs
- SqlCacheDependencyDatabaseCollection.cs
- PerformanceCounterPermission.cs
- MenuDesigner.cs
- SrgsRule.cs
- AnimatedTypeHelpers.cs
- SymDocumentType.cs
- CompatibleIComparer.cs
- WindowsFormsSectionHandler.cs
- XmlAnyElementAttributes.cs
- EventBuilder.cs
- UIntPtr.cs
- InputScopeConverter.cs
- MetadataSource.cs
- While.cs
- DataShape.cs
- RC2.cs
- TouchesCapturedWithinProperty.cs
- WebPartAuthorizationEventArgs.cs
- ObjectQuery.cs
- DataGridViewRow.cs
- InstanceLockException.cs
- CurrentTimeZone.cs
- ElementHostPropertyMap.cs
- QilSortKey.cs
- RSAProtectedConfigurationProvider.cs
- CodePrimitiveExpression.cs
- WindowsUpDown.cs
- CustomValidator.cs
- XmlProcessingInstruction.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- HtmlTableCell.cs
- DataGridViewCellToolTipTextNeededEventArgs.cs
- SpecularMaterial.cs
- CngProvider.cs
- BinaryFormatterSinks.cs
- Preprocessor.cs