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
- Stackframe.cs
- ADConnectionHelper.cs
- MimeTypePropertyAttribute.cs
- DataGridPageChangedEventArgs.cs
- RadioButtonFlatAdapter.cs
- XPathMessageFilter.cs
- BasicExpressionVisitor.cs
- DataGridViewLinkCell.cs
- NotImplementedException.cs
- TypeSystemProvider.cs
- ChannelSettingsElement.cs
- StreamUpgradeAcceptor.cs
- DecoderFallbackWithFailureFlag.cs
- ActivityPropertyReference.cs
- BamlRecordReader.cs
- CuspData.cs
- listitem.cs
- ControlValuePropertyAttribute.cs
- NativeMethods.cs
- WindowsImpersonationContext.cs
- controlskin.cs
- CanonicalFontFamilyReference.cs
- TdsParserStateObject.cs
- MachineKeySection.cs
- WhereQueryOperator.cs
- PanelDesigner.cs
- SimpleMailWebEventProvider.cs
- ClientEventManager.cs
- DynamicRendererThreadManager.cs
- TextServicesCompartmentContext.cs
- SoapObjectInfo.cs
- FontStyleConverter.cs
- SqlStream.cs
- SystemThemeKey.cs
- ErrorProvider.cs
- DataSetUtil.cs
- WindowsListViewScroll.cs
- WSSecureConversationFeb2005.cs
- WindowsRegion.cs
- UriTemplate.cs
- DataGridViewCellMouseEventArgs.cs
- IisTraceListener.cs
- CheckStoreFileValidityRequest.cs
- FileAuthorizationModule.cs
- DashStyles.cs
- COM2ExtendedBrowsingHandler.cs
- TypeGeneratedEventArgs.cs
- ILGenerator.cs
- EntityContainerEmitter.cs
- TemplateKeyConverter.cs
- BuildProvidersCompiler.cs
- CodeNamespaceCollection.cs
- InvalidCardException.cs
- TypeExtension.cs
- WriteFileContext.cs
- HttpResponseHeader.cs
- SecurityContextCookieSerializer.cs
- MergeFilterQuery.cs
- XmlEnumAttribute.cs
- LocalFileSettingsProvider.cs
- RowsCopiedEventArgs.cs
- WebPartTracker.cs
- TreeIterator.cs
- Propagator.JoinPropagator.SubstitutingCloneVisitor.cs
- IndexedString.cs
- ProtocolsConfiguration.cs
- COM2PropertyDescriptor.cs
- SchemaInfo.cs
- DBConnection.cs
- UndoManager.cs
- TextSelectionHelper.cs
- SystemIPAddressInformation.cs
- SettingsSavedEventArgs.cs
- EntityDataSourceConfigureObjectContextPanel.cs
- TrackPoint.cs
- Set.cs
- Pair.cs
- TokenizerHelper.cs
- ServiceNameElement.cs
- SqlXml.cs
- QueryGeneratorBase.cs
- SelectionItemPattern.cs
- IPHostEntry.cs
- ExpandCollapseIsCheckedConverter.cs
- XPathDocument.cs
- QueuePathDialog.cs
- ZipIOExtraFieldPaddingElement.cs
- ProtocolElement.cs
- TextServicesDisplayAttributePropertyRanges.cs
- SignatureHelper.cs
- CodeMethodInvokeExpression.cs
- DbCommandDefinition.cs
- SmtpDigestAuthenticationModule.cs
- TransactionTraceIdentifier.cs
- EventData.cs
- ResourceType.cs
- PerformanceCounter.cs
- UIElement3D.cs
- MetadataCache.cs
- ListBoxItemWrapperAutomationPeer.cs