Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / 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
- ProfileSettingsCollection.cs
- XmlWriterTraceListener.cs
- UTF32Encoding.cs
- MemberDescriptor.cs
- DataColumnPropertyDescriptor.cs
- CurrencyWrapper.cs
- DeclarationUpdate.cs
- SqlDeflator.cs
- HandlerWithFactory.cs
- MessageSmuggler.cs
- TypeReference.cs
- HandledMouseEvent.cs
- PrtCap_Public_Simple.cs
- Sql8ExpressionRewriter.cs
- SoapServerMethod.cs
- FlowDocumentScrollViewer.cs
- DesignTimeXamlWriter.cs
- StatusStrip.cs
- AutoScrollHelper.cs
- StringSource.cs
- SimpleHandlerBuildProvider.cs
- HealthMonitoringSectionHelper.cs
- PointHitTestResult.cs
- DoubleAnimationUsingKeyFrames.cs
- Command.cs
- SqlBulkCopyColumnMapping.cs
- FigureParagraph.cs
- PreProcessInputEventArgs.cs
- WebPartMenu.cs
- GrowingArray.cs
- TemplatePropertyEntry.cs
- EventBuilder.cs
- TrailingSpaceComparer.cs
- complextypematerializer.cs
- StreamFormatter.cs
- XamlInterfaces.cs
- WebServicesSection.cs
- BamlMapTable.cs
- CommandField.cs
- TextCharacters.cs
- TerminatorSinks.cs
- DispatcherProcessingDisabled.cs
- InternalControlCollection.cs
- PartialCachingControl.cs
- BindingNavigator.cs
- TableAdapterManagerGenerator.cs
- IndentedWriter.cs
- ProcessInfo.cs
- HttpAsyncResult.cs
- ErrorProvider.cs
- DecimalKeyFrameCollection.cs
- DbParameterCollection.cs
- RootNamespaceAttribute.cs
- Int64Storage.cs
- Timer.cs
- SqlDeflator.cs
- CompiledRegexRunner.cs
- ComponentChangingEvent.cs
- ListBase.cs
- StreamAsIStream.cs
- IdnMapping.cs
- MessageQueueKey.cs
- QuaternionAnimationUsingKeyFrames.cs
- SafeArrayRankMismatchException.cs
- XmlSchemaImporter.cs
- WindowsGraphicsWrapper.cs
- RelationshipEndMember.cs
- RuleSettings.cs
- RefreshEventArgs.cs
- AddInServer.cs
- MultipleCopiesCollection.cs
- TextEffectCollection.cs
- DispatcherExceptionFilterEventArgs.cs
- NavigateEvent.cs
- StateWorkerRequest.cs
- ServicePointManager.cs
- ToolboxBitmapAttribute.cs
- TextDpi.cs
- FamilyTypefaceCollection.cs
- XmlDocumentFragment.cs
- RegisteredArrayDeclaration.cs
- StopStoryboard.cs
- SortAction.cs
- SapiAttributeParser.cs
- VisualCollection.cs
- BinaryObjectInfo.cs
- HttpFileCollection.cs
- StylusDevice.cs
- Label.cs
- PrimitiveType.cs
- List.cs
- DataObjectPastingEventArgs.cs
- RuntimeEnvironment.cs
- WebBrowserHelper.cs
- UnhandledExceptionEventArgs.cs
- SQLRoleProvider.cs
- InkCollectionBehavior.cs
- SerialPinChanges.cs
- ParentQuery.cs
- COM2PropertyPageUITypeConverter.cs