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
- RegexParser.cs
- WorkflowDispatchContext.cs
- AffineTransform3D.cs
- SerializationSectionGroup.cs
- DataGridDesigner.cs
- XmlStringTable.cs
- AppDomain.cs
- WebPartMenu.cs
- XslException.cs
- DataControlLinkButton.cs
- CustomServiceCredentials.cs
- FormatterConverter.cs
- ParseHttpDate.cs
- SettingsPropertyNotFoundException.cs
- EntityClassGenerator.cs
- BaseConfigurationRecord.cs
- SystemIcmpV4Statistics.cs
- SecurityState.cs
- ChannelDispatcherCollection.cs
- TypeDescriptor.cs
- EncoderParameters.cs
- PropertyDescriptorGridEntry.cs
- DecoratedNameAttribute.cs
- PrefixHandle.cs
- FileInfo.cs
- ToolStripSeparatorRenderEventArgs.cs
- FixedSOMLineCollection.cs
- DrawingImage.cs
- DetailsViewRow.cs
- ManualResetEvent.cs
- ReferenceList.cs
- PagedDataSource.cs
- CollectionViewGroupInternal.cs
- CultureInfo.cs
- EncryptedData.cs
- EditorZone.cs
- SecurityIdentifierConverter.cs
- WebPart.cs
- SafeEventHandle.cs
- WebServicesInteroperability.cs
- FixedDSBuilder.cs
- TextBoxRenderer.cs
- ToolStripPanelCell.cs
- BaseAsyncResult.cs
- HttpPostedFileWrapper.cs
- ProcessProtocolHandler.cs
- MessageEnumerator.cs
- InlinedAggregationOperator.cs
- Inflater.cs
- Message.cs
- GeometryModel3D.cs
- Query.cs
- ImageList.cs
- WebPartHelpVerb.cs
- UshortList2.cs
- PageAsyncTask.cs
- ServiceOperation.cs
- ParentQuery.cs
- RuleSettingsCollection.cs
- CustomErrorCollection.cs
- WebPartZoneDesigner.cs
- CommandPlan.cs
- MaskedTextBoxDesigner.cs
- Stackframe.cs
- DictionarySectionHandler.cs
- InfiniteIntConverter.cs
- SubtreeProcessor.cs
- InputBindingCollection.cs
- FontStyle.cs
- TextEffect.cs
- PublisherIdentityPermission.cs
- PtsCache.cs
- mediaeventshelper.cs
- BrushValueSerializer.cs
- SupportingTokenParameters.cs
- xmlsaver.cs
- StringUtil.cs
- RoutedPropertyChangedEventArgs.cs
- StylusTip.cs
- BinaryObjectInfo.cs
- BamlRecordWriter.cs
- CheckBoxFlatAdapter.cs
- SafeBitVector32.cs
- BufferedStream.cs
- Selector.cs
- SchemaMapping.cs
- MetadataImporterQuotas.cs
- CapabilitiesUse.cs
- ReadOnlyKeyedCollection.cs
- SwitchElementsCollection.cs
- RecordBuilder.cs
- CqlParser.cs
- VisualTreeHelper.cs
- LinqDataSourceView.cs
- GenericAuthenticationEventArgs.cs
- EnumCodeDomSerializer.cs
- ZipIOModeEnforcingStream.cs
- Scanner.cs
- FrameworkContentElementAutomationPeer.cs
- AccessDataSourceView.cs