Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlUnionizer.cs / 1305376 / SqlUnionizer.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics.CodeAnalysis;
namespace System.Data.Linq.SqlClient {
internal class SqlUnionizer {
internal static SqlNode Unionize(SqlNode node) {
return new Visitor().Visit(node);
}
class Visitor : SqlVisitor {
internal override SqlSelect VisitSelect(SqlSelect select) {
base.VisitSelect(select);
// enforce exact ordering of columns in union selects
SqlUnion union = this.GetUnion(select.From);
if (union != null) {
SqlSelect sleft = union.Left as SqlSelect;
SqlSelect sright = union.Right as SqlSelect;
if (sleft != null & sright != null) {
// preset ordinals to high values (so any unreachable column definition is ordered last)
for (int i = 0, n = sleft.Row.Columns.Count; i < n; i++) {
sleft.Row.Columns[i].Ordinal = select.Row.Columns.Count + i;
}
for (int i = 0, n = sright.Row.Columns.Count; i < n; i++) {
sright.Row.Columns[i].Ordinal = select.Row.Columns.Count + i;
}
// next assign ordinals to all direct columns in subselects
for (int i = 0, n = select.Row.Columns.Count; i < n; i++) {
SqlExprSet es = select.Row.Columns[i].Expression as SqlExprSet;
if (es != null) {
for (int e = 0, en = es.Expressions.Count; e < en; e++) {
SqlColumnRef cr = es.Expressions[e] as SqlColumnRef;
if (cr != null && e >= select.Row.Columns.Count) {
cr.Column.Ordinal = i;
}
}
}
}
// next sort columns in left & right subselects
Comparison comp = (x,y) => x.Ordinal - y.Ordinal;
sleft.Row.Columns.Sort(comp);
sright.Row.Columns.Sort(comp);
}
}
return select;
}
[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Unknown reason.")]
private SqlUnion GetUnion(SqlSource source) {
SqlAlias alias = source as SqlAlias;
if (alias != null) {
SqlUnion union = alias.Node as SqlUnion;
if (union != null)
return union;
}
return null;
}
}
}
}
// 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.Diagnostics.CodeAnalysis;
namespace System.Data.Linq.SqlClient {
internal class SqlUnionizer {
internal static SqlNode Unionize(SqlNode node) {
return new Visitor().Visit(node);
}
class Visitor : SqlVisitor {
internal override SqlSelect VisitSelect(SqlSelect select) {
base.VisitSelect(select);
// enforce exact ordering of columns in union selects
SqlUnion union = this.GetUnion(select.From);
if (union != null) {
SqlSelect sleft = union.Left as SqlSelect;
SqlSelect sright = union.Right as SqlSelect;
if (sleft != null & sright != null) {
// preset ordinals to high values (so any unreachable column definition is ordered last)
for (int i = 0, n = sleft.Row.Columns.Count; i < n; i++) {
sleft.Row.Columns[i].Ordinal = select.Row.Columns.Count + i;
}
for (int i = 0, n = sright.Row.Columns.Count; i < n; i++) {
sright.Row.Columns[i].Ordinal = select.Row.Columns.Count + i;
}
// next assign ordinals to all direct columns in subselects
for (int i = 0, n = select.Row.Columns.Count; i < n; i++) {
SqlExprSet es = select.Row.Columns[i].Expression as SqlExprSet;
if (es != null) {
for (int e = 0, en = es.Expressions.Count; e < en; e++) {
SqlColumnRef cr = es.Expressions[e] as SqlColumnRef;
if (cr != null && e >= select.Row.Columns.Count) {
cr.Column.Ordinal = i;
}
}
}
}
// next sort columns in left & right subselects
Comparison comp = (x,y) => x.Ordinal - y.Ordinal;
sleft.Row.Columns.Sort(comp);
sright.Row.Columns.Sort(comp);
}
}
return select;
}
[SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Unknown reason.")]
private SqlUnion GetUnion(SqlSource source) {
SqlAlias alias = source as SqlAlias;
if (alias != null) {
SqlUnion union = alias.Node as SqlUnion;
if (union != null)
return union;
}
return null;
}
}
}
}
// 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
- ListViewDeleteEventArgs.cs
- FrameDimension.cs
- EntityViewContainer.cs
- Mutex.cs
- HtmlImage.cs
- BuildProvider.cs
- DefaultPerformanceCounters.cs
- _SslState.cs
- Baml6Assembly.cs
- AlignmentYValidation.cs
- MemoryPressure.cs
- PathFigureCollection.cs
- entityreference_tresulttype.cs
- StyleSelector.cs
- ManifestBasedResourceGroveler.cs
- XmlRootAttribute.cs
- Utils.cs
- typedescriptorpermissionattribute.cs
- InvalidOperationException.cs
- ipaddressinformationcollection.cs
- CustomAttributeSerializer.cs
- CommentAction.cs
- DataGridColumn.cs
- ValidatorCollection.cs
- DataListItem.cs
- AppDomain.cs
- ServiceBuildProvider.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- SecurityUtils.cs
- SqlProviderManifest.cs
- CorrelationManager.cs
- TabletDeviceInfo.cs
- EventArgs.cs
- Rect3D.cs
- processwaithandle.cs
- FixedNode.cs
- XPathNode.cs
- Exceptions.cs
- StrongNameMembershipCondition.cs
- Listener.cs
- ServiceMetadataPublishingElement.cs
- ParamArrayAttribute.cs
- PreviewPageInfo.cs
- MarginsConverter.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- TcpConnectionPool.cs
- CacheMode.cs
- formatter.cs
- ResXResourceSet.cs
- XmlILTrace.cs
- StringFormat.cs
- nulltextnavigator.cs
- RtType.cs
- SAPICategories.cs
- XhtmlConformanceSection.cs
- ComplexTypeEmitter.cs
- AsymmetricSignatureDeformatter.cs
- MimeTextImporter.cs
- Rect3DValueSerializer.cs
- SEHException.cs
- MutexSecurity.cs
- Style.cs
- ImageInfo.cs
- EncryptedPackageFilter.cs
- XmlNotation.cs
- TrustSection.cs
- PartialCachingControl.cs
- ErrorReporting.cs
- DateTimeOffsetStorage.cs
- RuleSetDialog.Designer.cs
- TypeSemantics.cs
- UTF7Encoding.cs
- InputBindingCollection.cs
- StylusButton.cs
- ListenerElementsCollection.cs
- SingleTagSectionHandler.cs
- DesignerView.xaml.cs
- UrlParameterWriter.cs
- ConnectionProviderAttribute.cs
- DataControlReferenceCollection.cs
- KeyInfo.cs
- FormsAuthenticationEventArgs.cs
- DbParameterCollection.cs
- XmlSerializerAssemblyAttribute.cs
- DbProviderFactories.cs
- HttpApplicationFactory.cs
- DateTimeFormatInfo.cs
- ConfigurationErrorsException.cs
- WorkflowFileItem.cs
- CommonXSendMessage.cs
- IncrementalReadDecoders.cs
- FrameworkContextData.cs
- COM2ExtendedTypeConverter.cs
- versioninfo.cs
- ViewgenContext.cs
- Marshal.cs
- BrushValueSerializer.cs
- Vector3DAnimationUsingKeyFrames.cs
- FunctionMappingTranslator.cs
- NumericUpDown.cs