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
- ReliableRequestSessionChannel.cs
- MasterPageParser.cs
- HwndSourceKeyboardInputSite.cs
- KnownBoxes.cs
- WebPartZoneBase.cs
- ReturnEventArgs.cs
- WebPartEditorCancelVerb.cs
- BidirectionalDictionary.cs
- PropertyItemInternal.cs
- LinqDataSourceContextEventArgs.cs
- HttpClientCertificate.cs
- UnsafeNativeMethods.cs
- CodeGotoStatement.cs
- HtmlListAdapter.cs
- SoapSchemaExporter.cs
- ReachUIElementCollectionSerializerAsync.cs
- ErrorsHelper.cs
- ApplicationContext.cs
- HttpServerVarsCollection.cs
- XamlSerializer.cs
- XmlIlVisitor.cs
- SecurityCriticalDataForSet.cs
- DBConnectionString.cs
- BamlResourceContent.cs
- XmlQueryContext.cs
- WorkflowDesignerColors.cs
- QueryServiceConfigHandle.cs
- MemberAccessException.cs
- EdmTypeAttribute.cs
- Task.cs
- DataListItem.cs
- KernelTypeValidation.cs
- securitycriticaldata.cs
- ThousandthOfEmRealDoubles.cs
- SuppressMessageAttribute.cs
- EditorZone.cs
- ComponentDispatcherThread.cs
- BamlMapTable.cs
- SyndicationSerializer.cs
- GridViewSelectEventArgs.cs
- DataControlFieldCollection.cs
- FindProgressChangedEventArgs.cs
- CanExecuteRoutedEventArgs.cs
- PolicyDesigner.cs
- WrapPanel.cs
- OAVariantLib.cs
- DataTemplateSelector.cs
- SecuritySessionSecurityTokenProvider.cs
- SqlCommand.cs
- BeginEvent.cs
- MetadataSource.cs
- AbsoluteQuery.cs
- FacetChecker.cs
- XmlCharacterData.cs
- XmlSchemaSearchPattern.cs
- HtmlGenericControl.cs
- StorageComplexPropertyMapping.cs
- BufferCache.cs
- WebBrowsableAttribute.cs
- UndoEngine.cs
- MarkupCompiler.cs
- SendingRequestEventArgs.cs
- DesigntimeLicenseContext.cs
- TCPListener.cs
- EditorPartChrome.cs
- DateTimeValueSerializer.cs
- TdsValueSetter.cs
- Walker.cs
- MouseBinding.cs
- BuildManagerHost.cs
- base64Transforms.cs
- SessionStateSection.cs
- IsolatedStorageFilePermission.cs
- TabPanel.cs
- _Win32.cs
- HMAC.cs
- DataServiceConfiguration.cs
- Timer.cs
- TypeForwardedToAttribute.cs
- XmlHelper.cs
- XmlSerializerSection.cs
- AuditLog.cs
- BaseTemplateParser.cs
- StrongTypingException.cs
- Row.cs
- ContractMapping.cs
- InkCanvasAutomationPeer.cs
- DispatcherObject.cs
- InternalException.cs
- ContentDisposition.cs
- MimeFormatter.cs
- LocalizationComments.cs
- ViewStateChangedEventArgs.cs
- ProxyGenerator.cs
- PolyQuadraticBezierSegmentFigureLogic.cs
- HistoryEventArgs.cs
- BuildManager.cs
- DataGrid.cs
- EventProxy.cs
- MustUnderstandSoapException.cs