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
- TextTreeInsertElementUndoUnit.cs
- TypeUtils.cs
- CodeAttributeDeclaration.cs
- DataSourceHelper.cs
- RegistryPermission.cs
- SecurityCapabilities.cs
- Schedule.cs
- AspCompat.cs
- ContentPosition.cs
- ExpressionBindings.cs
- IpcPort.cs
- CheckBoxList.cs
- ObjRef.cs
- AutoSizeComboBox.cs
- DeploymentSectionCache.cs
- DecodeHelper.cs
- FloaterParaClient.cs
- ScaleTransform.cs
- HttpModuleCollection.cs
- EntityDataSourceDesigner.cs
- Enum.cs
- _Events.cs
- RenderingBiasValidation.cs
- XmlEncodedRawTextWriter.cs
- DirtyTextRange.cs
- DataServiceContext.cs
- TransformerConfigurationWizardBase.cs
- TrustManager.cs
- FormViewUpdatedEventArgs.cs
- AstNode.cs
- SystemWebSectionGroup.cs
- BaseCAMarshaler.cs
- CommonObjectSecurity.cs
- BitmapCodecInfoInternal.cs
- DirectoryRootQuery.cs
- AssertUtility.cs
- EvidenceTypeDescriptor.cs
- DispatcherEventArgs.cs
- ViewSimplifier.cs
- InfoCardRequestException.cs
- ReturnValue.cs
- Span.cs
- MembershipPasswordException.cs
- SimpleWorkerRequest.cs
- XmlQualifiedNameTest.cs
- XamlReaderConstants.cs
- ManualWorkflowSchedulerService.cs
- HttpProfileGroupBase.cs
- EncodingTable.cs
- ResolvedKeyFrameEntry.cs
- FixedSOMTextRun.cs
- HuffModule.cs
- SecurityKeyIdentifierClause.cs
- AutomationEvent.cs
- MessageContractAttribute.cs
- RuntimeHelpers.cs
- GatewayDefinition.cs
- SmtpNtlmAuthenticationModule.cs
- DataFormats.cs
- PropertyPushdownHelper.cs
- SoapElementAttribute.cs
- BindingEntityInfo.cs
- Char.cs
- RequestQueue.cs
- DataServiceHostFactory.cs
- CharAnimationUsingKeyFrames.cs
- TrackPointCollection.cs
- AutoResetEvent.cs
- CopyCodeAction.cs
- CellParagraph.cs
- TransformConverter.cs
- X509RecipientCertificateClientElement.cs
- AppSettings.cs
- XmlSchemas.cs
- OdbcParameter.cs
- ProfileParameter.cs
- RoleManagerEventArgs.cs
- DataView.cs
- CatalogPartCollection.cs
- WmlSelectionListAdapter.cs
- Quad.cs
- DeploymentSection.cs
- Accessors.cs
- SafeNativeMethodsOther.cs
- CompilationSection.cs
- ReadOnlyDictionary.cs
- documentsequencetextpointer.cs
- SqlProviderServices.cs
- CalendarDay.cs
- HtmlLabelAdapter.cs
- CharacterShapingProperties.cs
- EmptyStringExpandableObjectConverter.cs
- TemplatedMailWebEventProvider.cs
- PropertyEntry.cs
- ContentPathSegment.cs
- DbConnectionPoolGroupProviderInfo.cs
- UdpTransportSettingsElement.cs
- DiagnosticsConfigurationHandler.cs
- CorrelationService.cs
- SelectionProcessor.cs