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
- EntityDataSourceReferenceGroup.cs
- IsolatedStorageFilePermission.cs
- Shape.cs
- Utils.cs
- DtdParser.cs
- ViewSimplifier.cs
- CharKeyFrameCollection.cs
- InputElement.cs
- ReadOnlyTernaryTree.cs
- StructuredTypeEmitter.cs
- Queue.cs
- GCHandleCookieTable.cs
- TabletDevice.cs
- HandlerFactoryCache.cs
- ProcessModelSection.cs
- PeerOutputChannel.cs
- SqlDataSourceQueryEditorForm.cs
- WindowManager.cs
- ImageAttributes.cs
- StyleSelector.cs
- SiteMapProvider.cs
- NameValuePair.cs
- DataSourceViewSchemaConverter.cs
- BamlCollectionHolder.cs
- QueryOperationResponseOfT.cs
- ItemList.cs
- RemotingServices.cs
- PrintEvent.cs
- HeaderUtility.cs
- RichTextBoxAutomationPeer.cs
- BCryptNative.cs
- UnmanagedMemoryStream.cs
- COM2ColorConverter.cs
- ResourcesChangeInfo.cs
- BufferModesCollection.cs
- TraceUtility.cs
- TypeUsageBuilder.cs
- Visual3D.cs
- InternalConfigHost.cs
- Main.cs
- WeakEventTable.cs
- ReferenceTypeElement.cs
- HotSpot.cs
- _DomainName.cs
- ToolboxCategory.cs
- CharacterBufferReference.cs
- GlyphRunDrawing.cs
- FlowDocumentReader.cs
- NavigationFailedEventArgs.cs
- HideDisabledControlAdapter.cs
- EventMetadata.cs
- Int16AnimationBase.cs
- RegexCompilationInfo.cs
- TextBlock.cs
- SettingsPropertyWrongTypeException.cs
- CollectionAdapters.cs
- XPathAxisIterator.cs
- UriTemplateTrieLocation.cs
- SqlDataSourceConfigureSelectPanel.cs
- DescendentsWalkerBase.cs
- CompiledELinqQueryState.cs
- DBPropSet.cs
- OperationContextScope.cs
- AlphabeticalEnumConverter.cs
- TypeLibraryHelper.cs
- DataViewManager.cs
- SqlProfileProvider.cs
- TextElement.cs
- OleDbEnumerator.cs
- UnmanagedMemoryStream.cs
- WindowsToolbar.cs
- RewritingSimplifier.cs
- Tablet.cs
- ProviderIncompatibleException.cs
- PersistenceException.cs
- LineBreakRecord.cs
- ScriptDescriptor.cs
- ThreadStartException.cs
- PeerNameRecordCollection.cs
- CollectionContainer.cs
- ValueTypeFieldReference.cs
- DbModificationCommandTree.cs
- SHA384Managed.cs
- BooleanAnimationUsingKeyFrames.cs
- XmlBufferReader.cs
- XmlComment.cs
- _HelperAsyncResults.cs
- KeyValuePairs.cs
- MethodInfo.cs
- ToolBar.cs
- QilUnary.cs
- BuiltInExpr.cs
- AudioStateChangedEventArgs.cs
- Color.cs
- PDBReader.cs
- AppDomainAttributes.cs
- ChunkedMemoryStream.cs
- Parameter.cs
- CodeDomConfigurationHandler.cs
- BooleanSwitch.cs