Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlBooleanMismatchVisitor.cs / 1 / SqlBooleanMismatchVisitor.cs
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Data; namespace System.Data.Linq.SqlClient { using System.Data.Linq; using System.Diagnostics.CodeAnalysis; ////// This visitor searches for places where 'Predicate' is found but a 'Bit' /// was expected or vice versa. In response, it will call VisitBitExpectedPredicate /// and VisitPredicateExpectedBit. /// internal abstract class SqlBooleanMismatchVisitor : SqlVisitor { internal SqlBooleanMismatchVisitor() { } internal abstract SqlExpression ConvertValueToPredicate(SqlExpression valueExpression); internal abstract SqlExpression ConvertPredicateToValue(SqlExpression predicateExpression); internal override SqlSelect VisitSelect(SqlSelect select) { select.From = this.VisitSource(select.From); select.Where = this.VisitPredicate(select.Where); for (int i = 0, n = select.GroupBy.Count; i < n; i++) { select.GroupBy[i] = this.VisitExpression(select.GroupBy[i]); } select.Having = this.VisitPredicate(select.Having); for (int i = 0, n = select.OrderBy.Count; i < n; i++) { select.OrderBy[i].Expression = this.VisitExpression(select.OrderBy[i].Expression); } select.Top = this.VisitExpression(select.Top); select.Row = (SqlRow)this.Visit(select.Row); // don't visit selection //select.Selection = this.VisitExpression(select.Selection); return select; } internal override SqlSource VisitJoin(SqlJoin join) { join.Left = this.VisitSource(join.Left); join.Right = this.VisitSource(join.Right); join.Condition = this.VisitPredicate(join.Condition); return join; } internal override SqlExpression VisitUnaryOperator(SqlUnary uo) { if (uo.NodeType.IsUnaryOperatorExpectingPredicateOperand()) { uo.Operand = this.VisitPredicate(uo.Operand); } else { uo.Operand = this.VisitExpression(uo.Operand); } return uo; } internal override SqlExpression VisitBinaryOperator(SqlBinary bo) { if (bo.NodeType.IsBinaryOperatorExpectingPredicateOperands()) { bo.Left = this.VisitPredicate(bo.Left); bo.Right = this.VisitPredicate(bo.Right); } else { bo.Left = this.VisitExpression(bo.Left); bo.Right = this.VisitExpression(bo.Right); } return bo; } internal override SqlStatement VisitAssign(SqlAssign sa) { // L-Value of assign is never a 'Bit' nor a 'Predicate'. sa.LValue = this.VisitExpression(sa.LValue); sa.RValue = this.VisitExpression(sa.RValue); return sa; } internal override SqlExpression VisitSearchedCase(SqlSearchedCase c) { for (int i = 0, n = c.Whens.Count; i < n; i++) { SqlWhen when = c.Whens[i]; when.Match = this.VisitPredicate(when.Match); when.Value = this.VisitExpression(when.Value); } c.Else = this.VisitExpression(c.Else); return c; } internal override SqlExpression VisitLift(SqlLift lift) { lift.Expression = base.VisitExpression(lift.Expression); return lift; } ////// If an expression is type 'Bit' but a 'Predicate' is expected then /// call 'VisitBitExpectedPredicate'. /// internal SqlExpression VisitPredicate(SqlExpression exp) { exp = (SqlExpression)base.Visit(exp); if (exp != null) { if (!IsPredicateExpression(exp)) { exp = ConvertValueToPredicate(exp); } } return exp; } ////// Any remaining calls to VisitExpression expect a 'Bit' when there's /// a boolean expression. /// internal override SqlExpression VisitExpression(SqlExpression exp) { exp = (SqlExpression)base.Visit(exp); if (exp != null) { if (IsPredicateExpression(exp)) { exp = ConvertPredicateToValue(exp); } } return exp; } [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "These issues are related to our use of if-then and case statements for node types, which adds to the complexity count however when reviewed they are easy to navigate and understand.")] private static bool IsPredicateExpression(SqlExpression exp) { switch (exp.NodeType) { case SqlNodeType.And: case SqlNodeType.Or: case SqlNodeType.Not: case SqlNodeType.Not2V: case SqlNodeType.EQ: case SqlNodeType.EQ2V: case SqlNodeType.NE: case SqlNodeType.NE2V: case SqlNodeType.GE: case SqlNodeType.GT: case SqlNodeType.LE: case SqlNodeType.LT: case SqlNodeType.Exists: case SqlNodeType.Between: case SqlNodeType.In: case SqlNodeType.Like: case SqlNodeType.IsNotNull: case SqlNodeType.IsNull: return true; case SqlNodeType.Lift: return IsPredicateExpression(((SqlLift)exp).Expression); default: return false; } } } } // 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.Linq; using System.Linq.Expressions; using System.Data; namespace System.Data.Linq.SqlClient { using System.Data.Linq; using System.Diagnostics.CodeAnalysis; ////// This visitor searches for places where 'Predicate' is found but a 'Bit' /// was expected or vice versa. In response, it will call VisitBitExpectedPredicate /// and VisitPredicateExpectedBit. /// internal abstract class SqlBooleanMismatchVisitor : SqlVisitor { internal SqlBooleanMismatchVisitor() { } internal abstract SqlExpression ConvertValueToPredicate(SqlExpression valueExpression); internal abstract SqlExpression ConvertPredicateToValue(SqlExpression predicateExpression); internal override SqlSelect VisitSelect(SqlSelect select) { select.From = this.VisitSource(select.From); select.Where = this.VisitPredicate(select.Where); for (int i = 0, n = select.GroupBy.Count; i < n; i++) { select.GroupBy[i] = this.VisitExpression(select.GroupBy[i]); } select.Having = this.VisitPredicate(select.Having); for (int i = 0, n = select.OrderBy.Count; i < n; i++) { select.OrderBy[i].Expression = this.VisitExpression(select.OrderBy[i].Expression); } select.Top = this.VisitExpression(select.Top); select.Row = (SqlRow)this.Visit(select.Row); // don't visit selection //select.Selection = this.VisitExpression(select.Selection); return select; } internal override SqlSource VisitJoin(SqlJoin join) { join.Left = this.VisitSource(join.Left); join.Right = this.VisitSource(join.Right); join.Condition = this.VisitPredicate(join.Condition); return join; } internal override SqlExpression VisitUnaryOperator(SqlUnary uo) { if (uo.NodeType.IsUnaryOperatorExpectingPredicateOperand()) { uo.Operand = this.VisitPredicate(uo.Operand); } else { uo.Operand = this.VisitExpression(uo.Operand); } return uo; } internal override SqlExpression VisitBinaryOperator(SqlBinary bo) { if (bo.NodeType.IsBinaryOperatorExpectingPredicateOperands()) { bo.Left = this.VisitPredicate(bo.Left); bo.Right = this.VisitPredicate(bo.Right); } else { bo.Left = this.VisitExpression(bo.Left); bo.Right = this.VisitExpression(bo.Right); } return bo; } internal override SqlStatement VisitAssign(SqlAssign sa) { // L-Value of assign is never a 'Bit' nor a 'Predicate'. sa.LValue = this.VisitExpression(sa.LValue); sa.RValue = this.VisitExpression(sa.RValue); return sa; } internal override SqlExpression VisitSearchedCase(SqlSearchedCase c) { for (int i = 0, n = c.Whens.Count; i < n; i++) { SqlWhen when = c.Whens[i]; when.Match = this.VisitPredicate(when.Match); when.Value = this.VisitExpression(when.Value); } c.Else = this.VisitExpression(c.Else); return c; } internal override SqlExpression VisitLift(SqlLift lift) { lift.Expression = base.VisitExpression(lift.Expression); return lift; } ////// If an expression is type 'Bit' but a 'Predicate' is expected then /// call 'VisitBitExpectedPredicate'. /// internal SqlExpression VisitPredicate(SqlExpression exp) { exp = (SqlExpression)base.Visit(exp); if (exp != null) { if (!IsPredicateExpression(exp)) { exp = ConvertValueToPredicate(exp); } } return exp; } ////// Any remaining calls to VisitExpression expect a 'Bit' when there's /// a boolean expression. /// internal override SqlExpression VisitExpression(SqlExpression exp) { exp = (SqlExpression)base.Visit(exp); if (exp != null) { if (IsPredicateExpression(exp)) { exp = ConvertPredicateToValue(exp); } } return exp; } [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "These issues are related to our use of if-then and case statements for node types, which adds to the complexity count however when reviewed they are easy to navigate and understand.")] private static bool IsPredicateExpression(SqlExpression exp) { switch (exp.NodeType) { case SqlNodeType.And: case SqlNodeType.Or: case SqlNodeType.Not: case SqlNodeType.Not2V: case SqlNodeType.EQ: case SqlNodeType.EQ2V: case SqlNodeType.NE: case SqlNodeType.NE2V: case SqlNodeType.GE: case SqlNodeType.GT: case SqlNodeType.LE: case SqlNodeType.LT: case SqlNodeType.Exists: case SqlNodeType.Between: case SqlNodeType.In: case SqlNodeType.Like: case SqlNodeType.IsNotNull: case SqlNodeType.IsNull: return true; case SqlNodeType.Lift: return IsPredicateExpression(((SqlLift)exp).Expression); default: return false; } } } } // 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
- InvalidWMPVersionException.cs
- SerializationSectionGroup.cs
- Roles.cs
- DependencyPropertyConverter.cs
- HttpWriter.cs
- ToolStripDesignerAvailabilityAttribute.cs
- LoginDesignerUtil.cs
- FocusManager.cs
- FormattedText.cs
- NodeFunctions.cs
- PersonalizationAdministration.cs
- OleDbParameterCollection.cs
- LabelDesigner.cs
- CriticalFinalizerObject.cs
- Image.cs
- BitmapMetadataEnumerator.cs
- DoubleLinkListEnumerator.cs
- TypeBrowserDialog.cs
- XMLDiffLoader.cs
- JpegBitmapDecoder.cs
- ItemMap.cs
- ContractMapping.cs
- DbXmlEnabledProviderManifest.cs
- SHA256.cs
- LinearGradientBrush.cs
- FloatUtil.cs
- Condition.cs
- ParameterCollection.cs
- FileIOPermission.cs
- XNodeSchemaApplier.cs
- XmlUnspecifiedAttribute.cs
- ActivityWithResultValueSerializer.cs
- IApplicationTrustManager.cs
- KeyInterop.cs
- xsdvalidator.cs
- DBDataPermissionAttribute.cs
- InheritanceContextChangedEventManager.cs
- EntityDataSourceReferenceGroup.cs
- AssemblyBuilder.cs
- ListView.cs
- ObjectNotFoundException.cs
- XmlDownloadManager.cs
- ConnectionPoolManager.cs
- URLIdentityPermission.cs
- FixedSOMPageElement.cs
- AnimatedTypeHelpers.cs
- EncryptedKeyIdentifierClause.cs
- DataGridViewCellEventArgs.cs
- SettingsPropertyNotFoundException.cs
- HybridDictionary.cs
- DoubleCollection.cs
- CellIdBoolean.cs
- DetailsViewCommandEventArgs.cs
- ActivationArguments.cs
- SafePointer.cs
- DBSqlParserTable.cs
- BCLDebug.cs
- wgx_exports.cs
- ProfileProvider.cs
- LambdaCompiler.Binary.cs
- AddingNewEventArgs.cs
- PackagePartCollection.cs
- BamlCollectionHolder.cs
- SolidBrush.cs
- SamlAssertion.cs
- FileDialog.cs
- DataGridSortingEventArgs.cs
- OdbcConnectionHandle.cs
- SessionStateSection.cs
- FamilyMap.cs
- FilterException.cs
- AssemblyNameUtility.cs
- invalidudtexception.cs
- GridViewActionList.cs
- PartialCachingAttribute.cs
- EditorZoneBase.cs
- UInt32Storage.cs
- BinaryObjectInfo.cs
- MemberAccessException.cs
- HttpMethodAttribute.cs
- PageThemeParser.cs
- CollectionChangeEventArgs.cs
- TextPointerBase.cs
- SQLDouble.cs
- SerializationSectionGroup.cs
- PartialTrustHelpers.cs
- Math.cs
- RightsManagementEncryptionTransform.cs
- SQLMembershipProvider.cs
- DisplayNameAttribute.cs
- ServiceProviders.cs
- CryptoApi.cs
- UnsafeNativeMethods.cs
- ExpressionNormalizer.cs
- AnimationClock.cs
- SynchronizedInputAdaptor.cs
- IDictionary.cs
- PreservationFileReader.cs
- CurrencyWrapper.cs
- HtmlTableCell.cs