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
- RadioButtonBaseAdapter.cs
- MediaElementAutomationPeer.cs
- PathGeometry.cs
- ExclusiveNamedPipeTransportManager.cs
- EncoderNLS.cs
- PerformanceCounterPermissionEntryCollection.cs
- PriorityQueue.cs
- ImpersonationContext.cs
- DoubleAverageAggregationOperator.cs
- AsymmetricKeyExchangeDeformatter.cs
- NamedPipeTransportSecurity.cs
- SqlDataSourceEnumerator.cs
- DataKeyCollection.cs
- util.cs
- SBCSCodePageEncoding.cs
- Crypto.cs
- Decoder.cs
- returneventsaver.cs
- DatePicker.cs
- XhtmlBasicSelectionListAdapter.cs
- SafeThreadHandle.cs
- Bits.cs
- ConfigurationManagerHelperFactory.cs
- SourceFileBuildProvider.cs
- SoapInteropTypes.cs
- BindingValueChangedEventArgs.cs
- RoleManagerEventArgs.cs
- LongTypeConverter.cs
- MSAANativeProvider.cs
- XmlSerializerNamespaces.cs
- SpeakProgressEventArgs.cs
- ToolboxItemFilterAttribute.cs
- Point.cs
- DbConvert.cs
- OrthographicCamera.cs
- FileVersion.cs
- ToolStripDropDown.cs
- AsyncPostBackErrorEventArgs.cs
- KeyValueInternalCollection.cs
- PermissionAttributes.cs
- DEREncoding.cs
- ConnectorDragDropGlyph.cs
- InstanceBehavior.cs
- BitmapEffectDrawing.cs
- MdImport.cs
- TreeNodeCollection.cs
- Package.cs
- CodeTypeOfExpression.cs
- DeviceContext2.cs
- TimeStampChecker.cs
- ChangePassword.cs
- WebPartConnectionsConfigureVerb.cs
- Size3DConverter.cs
- TypePropertyEditor.cs
- Screen.cs
- PageTheme.cs
- EditorZone.cs
- ResXDataNode.cs
- ConfigXmlElement.cs
- SQLMoneyStorage.cs
- securitycriticaldataClass.cs
- PersonalizationDictionary.cs
- PropertyBuilder.cs
- TabletDevice.cs
- ParserStreamGeometryContext.cs
- DefaultTraceListener.cs
- WindowsScrollBarBits.cs
- ChtmlCommandAdapter.cs
- _NestedMultipleAsyncResult.cs
- EmptyControlCollection.cs
- XmlSchemaIdentityConstraint.cs
- GZipStream.cs
- Parser.cs
- _ChunkParse.cs
- ETagAttribute.cs
- CompressEmulationStream.cs
- ContainerControlDesigner.cs
- DocumentViewerBase.cs
- AlignmentYValidation.cs
- CorrelationManager.cs
- WinInetCache.cs
- InfoCardRSAOAEPKeyExchangeFormatter.cs
- ISFTagAndGuidCache.cs
- SchemaImporter.cs
- ConstrainedDataObject.cs
- CompositeKey.cs
- CheckBoxRenderer.cs
- TextDecoration.cs
- NamespaceEmitter.cs
- ContentPresenter.cs
- ComEventsHelper.cs
- RequestSecurityTokenForGetBrowserToken.cs
- MediaScriptCommandRoutedEventArgs.cs
- DataGridCellsPresenter.cs
- DbgUtil.cs
- TypeLoadException.cs
- ArcSegment.cs
- BamlWriter.cs
- ManagementObjectSearcher.cs
- BaseValidator.cs