Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlNamer.cs / 1 / SqlNamer.cs
using System; using System.Collections.Generic; using System.Text; using System.Data.Linq; using System.Diagnostics.CodeAnalysis; namespace System.Data.Linq.SqlClient { internal class SqlNamer { Visitor visitor; internal SqlNamer() { this.visitor = new Visitor(); } internal SqlNode AssignNames(SqlNode node) { return this.visitor.Visit(node); } class Visitor : SqlVisitor { int aliasCount; SqlAlias alias; bool makeUnique; bool useMappedNames; string lastName; internal Visitor() { this.makeUnique = true; this.useMappedNames = false; } internal string GetNextAlias() { return "t" + (aliasCount++); } internal override SqlAlias VisitAlias(SqlAlias sqlAlias) { SqlAlias save = this.alias; this.alias = sqlAlias; sqlAlias.Node = this.Visit(sqlAlias.Node); sqlAlias.Name = this.GetNextAlias(); this.alias = save; return sqlAlias; } internal override SqlExpression VisitScalarSubSelect(SqlSubSelect ss) { base.VisitScalarSubSelect(ss); if (ss.Select.Row.Columns.Count > 0) { System.Diagnostics.Debug.Assert(ss != null && ss.Select != null && ss.Select.Row != null && ss.Select.Row.Columns.Count == 1); // make sure these scalar subselects don't get redundantly named ss.Select.Row.Columns[0].Name = ""; } return ss; } internal override SqlStatement VisitInsert(SqlInsert insert) { bool saveMakeUnique = this.makeUnique; this.makeUnique = false; bool saveUseMappedNames = this.useMappedNames; this.useMappedNames = true; SqlStatement stmt = base.VisitInsert(insert); this.makeUnique = saveMakeUnique; this.useMappedNames = saveUseMappedNames; return stmt; } internal override SqlStatement VisitUpdate(SqlUpdate update) { bool saveMakeUnique = this.makeUnique; this.makeUnique = false; bool saveUseMappedNames = this.useMappedNames; this.useMappedNames = true; SqlStatement stmt = base.VisitUpdate(update); this.makeUnique = saveMakeUnique; this.useMappedNames = saveUseMappedNames; return stmt; } internal override SqlSelect VisitSelect(SqlSelect select) { select = base.VisitSelect(select); string[] names = new string[select.Row.Columns.Count]; for (int i = 0, n = names.Length; i < n; i++) { SqlColumn c = select.Row.Columns[i]; string name = c.Name; if (name == null) { name = SqlNamer.DiscoverName(c); } names[i] = name; c.Name = null; } var reservedNames = this.GetColumnNames(select.OrderBy); for (int i = 0, n = select.Row.Columns.Count; i < n; i++) { SqlColumn c = select.Row.Columns[i]; string rootName = names[i]; string name = rootName; if (this.makeUnique) { int iName = 1; while (!this.IsUniqueName(select.Row.Columns, reservedNames, c, name)) { iName++; name = rootName + iName; } } c.Name = name; c.Ordinal = i; } return select; } [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Unknown reason.")] private bool IsUniqueName(Listcolumns, ICollection reservedNames, SqlColumn c, string name) { foreach (SqlColumn sc in columns) { if (sc != c && string.Compare(sc.Name, name, StringComparison.OrdinalIgnoreCase) == 0) return false; } if (!IsSimpleColumn(c, name)) { return !reservedNames.Contains(name); } return true; } /// /// An expression is a simple reprojection if it's a column node whose expression is null, or /// whose expression is a column whose name matches the name of the given name or where /// where the given name is null or empty. /// /// ///private static bool IsSimpleColumn(SqlColumn c, string name) { if (c.Expression != null) { switch (c.Expression.NodeType) { case SqlNodeType.ColumnRef: var colRef = c.Expression as SqlColumnRef; return String.IsNullOrEmpty(name) || string.Compare(name, colRef.Column.Name, StringComparison.OrdinalIgnoreCase) == 0; default: return false; } } return true; } internal override SqlExpression VisitExpression(SqlExpression expr) { string saveLastName = this.lastName; this.lastName = null; try { return (SqlExpression)this.Visit(expr); } finally { this.lastName = saveLastName; } } private SqlExpression VisitNamedExpression(SqlExpression expr, string name) { string saveLastName = this.lastName; this.lastName = name; try { return (SqlExpression)this.Visit(expr); } finally { this.lastName = saveLastName; } } internal override SqlExpression VisitColumnRef(SqlColumnRef cref) { if (cref.Column.Name == null && this.lastName != null) { cref.Column.Name = this.lastName; } return cref; } internal override SqlExpression VisitNew(SqlNew sox) { if (sox.Constructor != null) { System.Reflection.ParameterInfo[] pis = sox.Constructor.GetParameters(); for (int i = 0, n = sox.Args.Count; i < n; i++) { sox.Args[i] = this.VisitNamedExpression(sox.Args[i], pis[i].Name); } } else { for (int i = 0, n = sox.Args.Count; i < n; i++) { sox.Args[i] = this.VisitExpression(sox.Args[i]); } } foreach (SqlMemberAssign ma in sox.Members) { string n = ma.Member.Name; if (this.useMappedNames) { n = sox.MetaType.GetDataMember(ma.Member).MappedName; } ma.Expression = this.VisitNamedExpression(ma.Expression, n); } return sox; } internal override SqlExpression VisitGrouping(SqlGrouping g) { g.Key = this.VisitNamedExpression(g.Key, "Key"); g.Group = this.VisitNamedExpression(g.Group, "Group"); return g; } internal override SqlExpression VisitOptionalValue(SqlOptionalValue sov) { sov.HasValue = this.VisitNamedExpression(sov.HasValue, "test"); sov.Value = this.VisitExpression(sov.Value); return sov; } internal override SqlExpression VisitMethodCall(SqlMethodCall mc) { mc.Object = this.VisitExpression(mc.Object); System.Reflection.ParameterInfo[] pis = mc.Method.GetParameters(); for (int i = 0, n = mc.Arguments.Count; i < n; i++) { mc.Arguments[i] = this.VisitNamedExpression(mc.Arguments[i], pis[i].Name); } return mc; } ICollection GetColumnNames(IEnumerable orderList) { var visitor = new ColumnNameGatherer(); foreach (var expr in orderList) { visitor.Visit(expr.Expression); } return visitor.Names; } } internal static string DiscoverName(SqlExpression e) { if (e != null) { switch (e.NodeType) { case SqlNodeType.Column: return DiscoverName(((SqlColumn)e).Expression); case SqlNodeType.ColumnRef: SqlColumnRef cref = (SqlColumnRef)e; if (cref.Column.Name != null) return cref.Column.Name; return DiscoverName(cref.Column); case SqlNodeType.ExprSet: SqlExprSet eset = (SqlExprSet)e; return DiscoverName(eset.Expressions[0]); } } return "value"; } class ColumnNameGatherer : SqlVisitor { public HashSet Names { get; set; } public ColumnNameGatherer() : base() { this.Names = new HashSet (); } internal override SqlExpression VisitColumn(SqlColumn col) { if (!String.IsNullOrEmpty(col.Name)) { this.Names.Add(col.Name); } return base.VisitColumn(col); } internal override SqlExpression VisitColumnRef(SqlColumnRef cref) { Visit(cref.Column); return base.VisitColumnRef(cref); } } } } // 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.Data.Linq; using System.Diagnostics.CodeAnalysis; namespace System.Data.Linq.SqlClient { internal class SqlNamer { Visitor visitor; internal SqlNamer() { this.visitor = new Visitor(); } internal SqlNode AssignNames(SqlNode node) { return this.visitor.Visit(node); } class Visitor : SqlVisitor { int aliasCount; SqlAlias alias; bool makeUnique; bool useMappedNames; string lastName; internal Visitor() { this.makeUnique = true; this.useMappedNames = false; } internal string GetNextAlias() { return "t" + (aliasCount++); } internal override SqlAlias VisitAlias(SqlAlias sqlAlias) { SqlAlias save = this.alias; this.alias = sqlAlias; sqlAlias.Node = this.Visit(sqlAlias.Node); sqlAlias.Name = this.GetNextAlias(); this.alias = save; return sqlAlias; } internal override SqlExpression VisitScalarSubSelect(SqlSubSelect ss) { base.VisitScalarSubSelect(ss); if (ss.Select.Row.Columns.Count > 0) { System.Diagnostics.Debug.Assert(ss != null && ss.Select != null && ss.Select.Row != null && ss.Select.Row.Columns.Count == 1); // make sure these scalar subselects don't get redundantly named ss.Select.Row.Columns[0].Name = ""; } return ss; } internal override SqlStatement VisitInsert(SqlInsert insert) { bool saveMakeUnique = this.makeUnique; this.makeUnique = false; bool saveUseMappedNames = this.useMappedNames; this.useMappedNames = true; SqlStatement stmt = base.VisitInsert(insert); this.makeUnique = saveMakeUnique; this.useMappedNames = saveUseMappedNames; return stmt; } internal override SqlStatement VisitUpdate(SqlUpdate update) { bool saveMakeUnique = this.makeUnique; this.makeUnique = false; bool saveUseMappedNames = this.useMappedNames; this.useMappedNames = true; SqlStatement stmt = base.VisitUpdate(update); this.makeUnique = saveMakeUnique; this.useMappedNames = saveUseMappedNames; return stmt; } internal override SqlSelect VisitSelect(SqlSelect select) { select = base.VisitSelect(select); string[] names = new string[select.Row.Columns.Count]; for (int i = 0, n = names.Length; i < n; i++) { SqlColumn c = select.Row.Columns[i]; string name = c.Name; if (name == null) { name = SqlNamer.DiscoverName(c); } names[i] = name; c.Name = null; } var reservedNames = this.GetColumnNames(select.OrderBy); for (int i = 0, n = select.Row.Columns.Count; i < n; i++) { SqlColumn c = select.Row.Columns[i]; string rootName = names[i]; string name = rootName; if (this.makeUnique) { int iName = 1; while (!this.IsUniqueName(select.Row.Columns, reservedNames, c, name)) { iName++; name = rootName + iName; } } c.Name = name; c.Ordinal = i; } return select; } [SuppressMessage("Microsoft.Performance", "CA1822:MarkMembersAsStatic", Justification="Unknown reason.")] private bool IsUniqueName(List columns, ICollection reservedNames, SqlColumn c, string name) { foreach (SqlColumn sc in columns) { if (sc != c && string.Compare(sc.Name, name, StringComparison.OrdinalIgnoreCase) == 0) return false; } if (!IsSimpleColumn(c, name)) { return !reservedNames.Contains(name); } return true; } /// /// An expression is a simple reprojection if it's a column node whose expression is null, or /// whose expression is a column whose name matches the name of the given name or where /// where the given name is null or empty. /// /// ///private static bool IsSimpleColumn(SqlColumn c, string name) { if (c.Expression != null) { switch (c.Expression.NodeType) { case SqlNodeType.ColumnRef: var colRef = c.Expression as SqlColumnRef; return String.IsNullOrEmpty(name) || string.Compare(name, colRef.Column.Name, StringComparison.OrdinalIgnoreCase) == 0; default: return false; } } return true; } internal override SqlExpression VisitExpression(SqlExpression expr) { string saveLastName = this.lastName; this.lastName = null; try { return (SqlExpression)this.Visit(expr); } finally { this.lastName = saveLastName; } } private SqlExpression VisitNamedExpression(SqlExpression expr, string name) { string saveLastName = this.lastName; this.lastName = name; try { return (SqlExpression)this.Visit(expr); } finally { this.lastName = saveLastName; } } internal override SqlExpression VisitColumnRef(SqlColumnRef cref) { if (cref.Column.Name == null && this.lastName != null) { cref.Column.Name = this.lastName; } return cref; } internal override SqlExpression VisitNew(SqlNew sox) { if (sox.Constructor != null) { System.Reflection.ParameterInfo[] pis = sox.Constructor.GetParameters(); for (int i = 0, n = sox.Args.Count; i < n; i++) { sox.Args[i] = this.VisitNamedExpression(sox.Args[i], pis[i].Name); } } else { for (int i = 0, n = sox.Args.Count; i < n; i++) { sox.Args[i] = this.VisitExpression(sox.Args[i]); } } foreach (SqlMemberAssign ma in sox.Members) { string n = ma.Member.Name; if (this.useMappedNames) { n = sox.MetaType.GetDataMember(ma.Member).MappedName; } ma.Expression = this.VisitNamedExpression(ma.Expression, n); } return sox; } internal override SqlExpression VisitGrouping(SqlGrouping g) { g.Key = this.VisitNamedExpression(g.Key, "Key"); g.Group = this.VisitNamedExpression(g.Group, "Group"); return g; } internal override SqlExpression VisitOptionalValue(SqlOptionalValue sov) { sov.HasValue = this.VisitNamedExpression(sov.HasValue, "test"); sov.Value = this.VisitExpression(sov.Value); return sov; } internal override SqlExpression VisitMethodCall(SqlMethodCall mc) { mc.Object = this.VisitExpression(mc.Object); System.Reflection.ParameterInfo[] pis = mc.Method.GetParameters(); for (int i = 0, n = mc.Arguments.Count; i < n; i++) { mc.Arguments[i] = this.VisitNamedExpression(mc.Arguments[i], pis[i].Name); } return mc; } ICollection GetColumnNames(IEnumerable orderList) { var visitor = new ColumnNameGatherer(); foreach (var expr in orderList) { visitor.Visit(expr.Expression); } return visitor.Names; } } internal static string DiscoverName(SqlExpression e) { if (e != null) { switch (e.NodeType) { case SqlNodeType.Column: return DiscoverName(((SqlColumn)e).Expression); case SqlNodeType.ColumnRef: SqlColumnRef cref = (SqlColumnRef)e; if (cref.Column.Name != null) return cref.Column.Name; return DiscoverName(cref.Column); case SqlNodeType.ExprSet: SqlExprSet eset = (SqlExprSet)e; return DiscoverName(eset.Expressions[0]); } } return "value"; } class ColumnNameGatherer : SqlVisitor { public HashSet Names { get; set; } public ColumnNameGatherer() : base() { this.Names = new HashSet (); } internal override SqlExpression VisitColumn(SqlColumn col) { if (!String.IsNullOrEmpty(col.Name)) { this.Names.Add(col.Name); } return base.VisitColumn(col); } internal override SqlExpression VisitColumnRef(SqlColumnRef cref) { Visit(cref.Column); return base.VisitColumnRef(cref); } } } } // 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
- UserPreferenceChangedEventArgs.cs
- WorkflowDesignerColors.cs
- UnsafeNativeMethods.cs
- DataGridClipboardCellContent.cs
- GridViewCancelEditEventArgs.cs
- OdbcParameterCollection.cs
- PropertyInfo.cs
- ExpressionWriter.cs
- DataTableClearEvent.cs
- PocoEntityKeyStrategy.cs
- NumericPagerField.cs
- ProviderMetadataCachedInformation.cs
- DataBinder.cs
- IOThreadScheduler.cs
- StructuredTypeInfo.cs
- WindowsToolbarAsMenu.cs
- MessageVersion.cs
- DefaultValueAttribute.cs
- FilterException.cs
- InputLanguageManager.cs
- ClientRequest.cs
- PropertyMap.cs
- KeyMatchBuilder.cs
- ContentPresenter.cs
- XmlSchemaDatatype.cs
- BaseParaClient.cs
- EpmSyndicationContentDeSerializer.cs
- OdbcStatementHandle.cs
- SimpleWebHandlerParser.cs
- HtmlDocument.cs
- BitmapEffectRenderDataResource.cs
- ForAllOperator.cs
- PolicyManager.cs
- WriteFileContext.cs
- SymbolEqualComparer.cs
- CodeDOMUtility.cs
- GetLedgerEntryForRecipientRequest.cs
- PixelFormat.cs
- DrawingAttributes.cs
- KeyConstraint.cs
- PatternMatcher.cs
- TreeWalker.cs
- AttachedPropertyDescriptor.cs
- remotingproxy.cs
- DbgUtil.cs
- BinHexEncoder.cs
- TdsParserSessionPool.cs
- RotateTransform.cs
- BamlResourceDeserializer.cs
- FolderLevelBuildProvider.cs
- DataGridViewColumnEventArgs.cs
- MemoryRecordBuffer.cs
- VectorAnimationUsingKeyFrames.cs
- PersonalizationStateInfo.cs
- ComAdminInterfaces.cs
- PeerSecurityManager.cs
- BamlResourceSerializer.cs
- EventSinkHelperWriter.cs
- PropertyEmitterBase.cs
- SectionUpdates.cs
- x509store.cs
- PersonalizationAdministration.cs
- MD5.cs
- DataDocumentXPathNavigator.cs
- MultiBindingExpression.cs
- ConfigurationPermission.cs
- ContainerAction.cs
- AppDomainShutdownMonitor.cs
- UrlUtility.cs
- FontStyles.cs
- XmlnsDictionary.cs
- MetaModel.cs
- AppliedDeviceFiltersEditor.cs
- ApplicationInfo.cs
- PenThreadPool.cs
- HttpProfileBase.cs
- AnimatedTypeHelpers.cs
- FixedDocument.cs
- AndCondition.cs
- SynthesizerStateChangedEventArgs.cs
- TableChangeProcessor.cs
- DataControlFieldCollection.cs
- HGlobalSafeHandle.cs
- DataGridViewButtonCell.cs
- ImageButton.cs
- PriorityQueue.cs
- UnknownBitmapEncoder.cs
- BaseServiceProvider.cs
- PriorityBindingExpression.cs
- UserControlCodeDomTreeGenerator.cs
- MachineKeySection.cs
- CodePageEncoding.cs
- DbExpressionBuilder.cs
- SqlNode.cs
- FileUpload.cs
- OracleException.cs
- TriggerAction.cs
- ConnectionStringsSection.cs
- SortKey.cs
- ServiceHostingEnvironment.cs