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
- SchemaLookupTable.cs
- KeyGestureConverter.cs
- Variant.cs
- XmlWrappingReader.cs
- TextEndOfParagraph.cs
- DataGridViewRowsRemovedEventArgs.cs
- LoginUtil.cs
- OleDbRowUpdatingEvent.cs
- TPLETWProvider.cs
- RectAnimation.cs
- DeploymentSectionCache.cs
- WindowsGraphics2.cs
- InfoCardKeyedHashAlgorithm.cs
- BufferAllocator.cs
- MediaPlayerState.cs
- HebrewNumber.cs
- CodeTypeParameter.cs
- ConstraintConverter.cs
- ViewLoader.cs
- BitmapEffectGeneralTransform.cs
- TextSpanModifier.cs
- MdbDataFileEditor.cs
- DependencyPropertyChangedEventArgs.cs
- DataFieldEditor.cs
- EntityDataSourceColumn.cs
- SizeValueSerializer.cs
- X509ClientCertificateCredentialsElement.cs
- ListViewSelectEventArgs.cs
- BorderGapMaskConverter.cs
- DecoderFallback.cs
- Int64KeyFrameCollection.cs
- GeneralTransformGroup.cs
- TemplateColumn.cs
- ObjectDataSourceSelectingEventArgs.cs
- PrinterUnitConvert.cs
- sqlpipe.cs
- SingleTagSectionHandler.cs
- ScaleTransform.cs
- ReturnType.cs
- ReferenceSchema.cs
- MetadataPropertyCollection.cs
- InstanceDescriptor.cs
- ComplexPropertyEntry.cs
- ServiceControllerDesigner.cs
- Rule.cs
- SnapLine.cs
- SoapFault.cs
- ValidatedControlConverter.cs
- NumericExpr.cs
- RSAPKCS1SignatureDeformatter.cs
- OpCodes.cs
- GridViewSelectEventArgs.cs
- WinInet.cs
- OrderedEnumerableRowCollection.cs
- UpdateCommand.cs
- DataGridViewIntLinkedList.cs
- ComponentResourceManager.cs
- OpenFileDialog.cs
- AssemblySettingAttributes.cs
- MoveSizeWinEventHandler.cs
- ArrayEditor.cs
- QuotedPrintableStream.cs
- XomlCompilerError.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- TableRow.cs
- NetworkInformationPermission.cs
- XmlSchemaRedefine.cs
- DeviceContext2.cs
- Dictionary.cs
- XmlWrappingWriter.cs
- WorkflowViewStateService.cs
- LocalIdKeyIdentifierClause.cs
- SimplePropertyEntry.cs
- TryCatchDesigner.xaml.cs
- MsmqIntegrationSecurityMode.cs
- RequestCacheValidator.cs
- StrokeNodeData.cs
- DataBoundControlAdapter.cs
- FunctionUpdateCommand.cs
- HtmlGenericControl.cs
- ServiceOperationParameter.cs
- ResourcesChangeInfo.cs
- _StreamFramer.cs
- DesignTimeTemplateParser.cs
- InfoCardBinaryReader.cs
- TemplateContent.cs
- _ProxyChain.cs
- DrawingContextDrawingContextWalker.cs
- Transform3D.cs
- ServiceDeploymentInfo.cs
- ReadOnlyAttribute.cs
- XmlSchemaAttributeGroupRef.cs
- UmAlQuraCalendar.cs
- XmlWriter.cs
- NestPullup.cs
- WebPartMovingEventArgs.cs
- CompilerState.cs
- SecurityTokenValidationException.cs
- Bind.cs
- RegexWriter.cs