Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Rotation3D.cs
- DesignerForm.cs
- DSGeneratorProblem.cs
- IndentTextWriter.cs
- CompareValidator.cs
- WebPartHelpVerb.cs
- DataServiceOperationContext.cs
- HashAlgorithm.cs
- MsmqHostedTransportManager.cs
- NotCondition.cs
- PageCatalogPart.cs
- UIElementHelper.cs
- ParseChildrenAsPropertiesAttribute.cs
- TableProviderWrapper.cs
- TypeValidationEventArgs.cs
- SqlUtil.cs
- UIHelper.cs
- UnauthorizedWebPart.cs
- SliderAutomationPeer.cs
- StreamGeometry.cs
- RemoteWebConfigurationHostStream.cs
- DataGridViewCheckBoxCell.cs
- HostingEnvironmentException.cs
- EventHandlerService.cs
- InternalsVisibleToAttribute.cs
- MyContact.cs
- InvalidAsynchronousStateException.cs
- Int32Converter.cs
- SparseMemoryStream.cs
- sqlinternaltransaction.cs
- HttpDebugHandler.cs
- StrokeCollectionDefaultValueFactory.cs
- Ref.cs
- LinqDataSourceHelper.cs
- ReservationCollection.cs
- ExternalException.cs
- SecurityState.cs
- LinkLabelLinkClickedEvent.cs
- TrustLevelCollection.cs
- Rect.cs
- unsafenativemethodsother.cs
- TextEffectResolver.cs
- Guid.cs
- RootBrowserWindow.cs
- MSAAWinEventWrap.cs
- EventRouteFactory.cs
- Pens.cs
- EdmEntityTypeAttribute.cs
- PrintEvent.cs
- SystemDiagnosticsSection.cs
- RequestNavigateEventArgs.cs
- SafeThemeHandle.cs
- TraceHwndHost.cs
- HttpWebRequestElement.cs
- OperatingSystem.cs
- PopupRoot.cs
- ReadOnlyDictionary.cs
- Point3DCollection.cs
- CellRelation.cs
- SessionEndingEventArgs.cs
- MappingException.cs
- SizeFConverter.cs
- InstanceDataCollectionCollection.cs
- ChangeTracker.cs
- EncoderFallback.cs
- StringUtil.cs
- ExpandCollapseIsCheckedConverter.cs
- SoapIgnoreAttribute.cs
- AlphabeticalEnumConverter.cs
- XmlQuerySequence.cs
- BaseCollection.cs
- SchemaNames.cs
- DataGridViewColumnDesignTimeVisibleAttribute.cs
- IsolatedStorageFile.cs
- XsdDataContractExporter.cs
- FormViewPageEventArgs.cs
- HtmlForm.cs
- XmlSchemaChoice.cs
- WorkflowDesigner.cs
- WindowExtensionMethods.cs
- DoubleAnimationBase.cs
- SoapException.cs
- WrappedReader.cs
- SatelliteContractVersionAttribute.cs
- WizardStepBase.cs
- PropertyCondition.cs
- EnumType.cs
- WebPartDisplayModeCollection.cs
- Merger.cs
- DiagnosticTraceRecords.cs
- StrictAndMessageFilter.cs
- MasterPage.cs
- FlowLayoutSettings.cs
- CreateUserWizard.cs
- DeploymentSectionCache.cs
- Stylesheet.cs
- SourceSwitch.cs
- StringUtil.cs
- Geometry3D.cs
- DataGridViewRowsAddedEventArgs.cs