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
- MenuRenderer.cs
- MembershipSection.cs
- SuppressMergeCheckAttribute.cs
- TreeNodeBindingCollection.cs
- WsdlBuildProvider.cs
- EntityDataSourceValidationException.cs
- QilNode.cs
- CssTextWriter.cs
- MatrixAnimationUsingKeyFrames.cs
- ReadWriteObjectLock.cs
- SystemInfo.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- XhtmlConformanceSection.cs
- ToolStripRenderEventArgs.cs
- OrCondition.cs
- Speller.cs
- ContainerSelectorGlyph.cs
- MarkupCompiler.cs
- PolyQuadraticBezierSegmentFigureLogic.cs
- XmlReader.cs
- XmlTextReader.cs
- OdbcDataReader.cs
- AnnotationMap.cs
- HwndSourceParameters.cs
- ConfigXmlElement.cs
- SortDescriptionCollection.cs
- MappingException.cs
- ParseNumbers.cs
- IisTraceWebEventProvider.cs
- RequestCachePolicyConverter.cs
- ReliabilityContractAttribute.cs
- WebPartHeaderCloseVerb.cs
- NativeStructs.cs
- ColorConvertedBitmap.cs
- DependencyProperty.cs
- securitycriticaldataformultiplegetandset.cs
- EntityContainerRelationshipSetEnd.cs
- Menu.cs
- MembershipSection.cs
- Publisher.cs
- httpserverutility.cs
- WebBrowserBase.cs
- ChangeNode.cs
- RelationshipDetailsRow.cs
- UniqueEventHelper.cs
- FolderBrowserDialogDesigner.cs
- NotImplementedException.cs
- ContentPropertyAttribute.cs
- XmlSchemaSimpleContent.cs
- ModulesEntry.cs
- ImageSourceValueSerializer.cs
- ProviderSettingsCollection.cs
- Control.cs
- CultureInfoConverter.cs
- COM2FontConverter.cs
- HttpCookie.cs
- AutoSizeComboBox.cs
- DependencyObjectProvider.cs
- ServiceSecurityContext.cs
- TableHeaderCell.cs
- MemoryFailPoint.cs
- FocusTracker.cs
- ListSourceHelper.cs
- UnicastIPAddressInformationCollection.cs
- Version.cs
- ToolboxItemFilterAttribute.cs
- ProjectionCamera.cs
- Sentence.cs
- CallbackValidator.cs
- DetailsViewDeletedEventArgs.cs
- ExpandSegment.cs
- MatrixKeyFrameCollection.cs
- XmlCollation.cs
- ConnectionString.cs
- TextReader.cs
- TextTreeDeleteContentUndoUnit.cs
- HtmlControl.cs
- Queue.cs
- StorageFunctionMapping.cs
- WindowsGrip.cs
- MultitargetUtil.cs
- WriterOutput.cs
- DbConnectionHelper.cs
- DataBoundControlActionList.cs
- ConnectivityStatus.cs
- RectKeyFrameCollection.cs
- IndentedTextWriter.cs
- VirtualPath.cs
- SHA384.cs
- StrokeNodeOperations2.cs
- X509Extension.cs
- VoiceObjectToken.cs
- LookupBindingPropertiesAttribute.cs
- DataSourceExpression.cs
- SymLanguageType.cs
- TextRunCache.cs
- FlatButtonAppearance.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- _NegotiateClient.cs
- PageAdapter.cs