Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- IPAddress.cs
- ResourcesChangeInfo.cs
- KnownTypesHelper.cs
- BuildProviderAppliesToAttribute.cs
- SafeSerializationManager.cs
- EntityDataSourceReferenceGroup.cs
- TextSchema.cs
- SqlRetyper.cs
- DurationConverter.cs
- XLinq.cs
- SqlConnectionPoolProviderInfo.cs
- validation.cs
- DataList.cs
- BoundField.cs
- RoleGroupCollection.cs
- ServiceElementCollection.cs
- DataColumnCollection.cs
- DataSourceControl.cs
- ListCollectionView.cs
- HttpHandlersSection.cs
- RNGCryptoServiceProvider.cs
- LinqDataView.cs
- ContextStack.cs
- TTSEvent.cs
- MessageBox.cs
- ButtonChrome.cs
- PageThemeParser.cs
- ProcessProtocolHandler.cs
- RuntimeUtils.cs
- KeyboardDevice.cs
- SchemaDeclBase.cs
- SessionStateModule.cs
- ProfileGroupSettingsCollection.cs
- _UriTypeConverter.cs
- FixedSOMFixedBlock.cs
- QilSortKey.cs
- Parser.cs
- SqlCaseSimplifier.cs
- InlinedAggregationOperatorEnumerator.cs
- StatusBarDrawItemEvent.cs
- SimpleTypeResolver.cs
- AtomMaterializer.cs
- UnmanagedMemoryStream.cs
- EventLevel.cs
- XPathAncestorIterator.cs
- GifBitmapDecoder.cs
- XslTransform.cs
- XmlWrappingWriter.cs
- ClientConfigPaths.cs
- EntityTemplateFactory.cs
- ToolboxItemAttribute.cs
- SafeEventLogWriteHandle.cs
- __Error.cs
- WorkflowServiceHostFactory.cs
- GridItemPatternIdentifiers.cs
- TableRowsCollectionEditor.cs
- DataGridViewSelectedCellCollection.cs
- HtmlTitle.cs
- SpnEndpointIdentityExtension.cs
- AppDomainManager.cs
- InkCanvas.cs
- MetadataArtifactLoaderCompositeFile.cs
- HttpHandlerActionCollection.cs
- DiscoveryReference.cs
- PartialCachingControl.cs
- CheckBoxRenderer.cs
- EventLogEntry.cs
- ConfigXmlReader.cs
- __Filters.cs
- QilPatternVisitor.cs
- DataColumnChangeEvent.cs
- SoapSchemaMember.cs
- Transactions.cs
- CodeMethodInvokeExpression.cs
- ExpressionDumper.cs
- EditorZoneBase.cs
- DefaultValueAttribute.cs
- EventMappingSettingsCollection.cs
- NotifyCollectionChangedEventArgs.cs
- CurrencyWrapper.cs
- TraceSection.cs
- ServiceDescriptionImporter.cs
- ActivityTypeDesigner.xaml.cs
- SoapIgnoreAttribute.cs
- FontFamily.cs
- BinaryFormatter.cs
- Console.cs
- EpmSourceTree.cs
- CompositeDataBoundControl.cs
- HttpResponseInternalWrapper.cs
- ConnectionOrientedTransportChannelListener.cs
- StaticResourceExtension.cs
- COM2ColorConverter.cs
- KnownBoxes.cs
- SelectorAutomationPeer.cs
- RelationshipDetailsCollection.cs
- _AutoWebProxyScriptHelper.cs
- Stream.cs
- ObjectListDesigner.cs
- UTF7Encoding.cs