Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SimpleExpression.cs / 1 / SimpleExpression.cs
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Data.Linq.Provider;
using System.Linq;
using System.Data.Linq.SqlClient;
using System.Diagnostics.CodeAnalysis;
namespace System.Data.Linq.SqlClient {
///
/// Determines whether an expression is simple or not.
/// Simple is a scalar expression that contains only functions, operators and column references
///
internal static class SimpleExpression {
internal static bool IsSimple(SqlExpression expr) {
Visitor v = new Visitor();
v.Visit(expr);
return v.IsSimple;
}
class Visitor : SqlVisitor {
bool isSimple = true;
internal bool IsSimple {
get { return this.isSimple; }
}
[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.")]
internal override SqlNode Visit(SqlNode node) {
if (node == null) {
return null;
}
if (!this.isSimple) {
return node;
}
switch (node.NodeType) {
case SqlNodeType.Not:
case SqlNodeType.Not2V:
case SqlNodeType.Negate:
case SqlNodeType.BitNot:
case SqlNodeType.IsNull:
case SqlNodeType.IsNotNull:
case SqlNodeType.ValueOf:
case SqlNodeType.OuterJoinedValue:
case SqlNodeType.ClrLength:
case SqlNodeType.Add:
case SqlNodeType.Sub:
case SqlNodeType.Mul:
case SqlNodeType.Div:
case SqlNodeType.Mod:
case SqlNodeType.BitAnd:
case SqlNodeType.BitOr:
case SqlNodeType.BitXor:
case SqlNodeType.And:
case SqlNodeType.Or:
case SqlNodeType.GE:
case SqlNodeType.GT:
case SqlNodeType.LE:
case SqlNodeType.LT:
case SqlNodeType.EQ:
case SqlNodeType.NE:
case SqlNodeType.EQ2V:
case SqlNodeType.NE2V:
case SqlNodeType.Between:
case SqlNodeType.Concat:
case SqlNodeType.Convert:
case SqlNodeType.Cast:
case SqlNodeType.Treat:
case SqlNodeType.Member:
case SqlNodeType.TypeCase:
case SqlNodeType.SearchedCase:
case SqlNodeType.SimpleCase:
case SqlNodeType.Like:
case SqlNodeType.FunctionCall:
case SqlNodeType.ExprSet:
case SqlNodeType.OptionalValue:
case SqlNodeType.Parameter:
case SqlNodeType.ColumnRef:
case SqlNodeType.Value:
case SqlNodeType.Variable:
return base.Visit(node);
case SqlNodeType.Column:
case SqlNodeType.ClientCase:
case SqlNodeType.DiscriminatedType:
case SqlNodeType.Link:
case SqlNodeType.Row:
case SqlNodeType.UserQuery:
case SqlNodeType.StoredProcedureCall:
case SqlNodeType.UserRow:
case SqlNodeType.UserColumn:
case SqlNodeType.Multiset:
case SqlNodeType.ScalarSubSelect:
case SqlNodeType.Element:
case SqlNodeType.Exists:
case SqlNodeType.Join:
case SqlNodeType.Select:
case SqlNodeType.New:
case SqlNodeType.ClientQuery:
case SqlNodeType.ClientArray:
case SqlNodeType.Insert:
case SqlNodeType.Update:
case SqlNodeType.Delete:
case SqlNodeType.MemberAssign:
case SqlNodeType.Assign:
case SqlNodeType.Block:
case SqlNodeType.Union:
case SqlNodeType.DoNotVisit:
case SqlNodeType.MethodCall:
case SqlNodeType.Nop:
default:
this.isSimple = false;
return node;
}
}
}
}
}
// 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.Expressions;
using System.Reflection;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Data.Linq.Provider;
using System.Linq;
using System.Data.Linq.SqlClient;
using System.Diagnostics.CodeAnalysis;
namespace System.Data.Linq.SqlClient {
///
/// Determines whether an expression is simple or not.
/// Simple is a scalar expression that contains only functions, operators and column references
///
internal static class SimpleExpression {
internal static bool IsSimple(SqlExpression expr) {
Visitor v = new Visitor();
v.Visit(expr);
return v.IsSimple;
}
class Visitor : SqlVisitor {
bool isSimple = true;
internal bool IsSimple {
get { return this.isSimple; }
}
[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.")]
internal override SqlNode Visit(SqlNode node) {
if (node == null) {
return null;
}
if (!this.isSimple) {
return node;
}
switch (node.NodeType) {
case SqlNodeType.Not:
case SqlNodeType.Not2V:
case SqlNodeType.Negate:
case SqlNodeType.BitNot:
case SqlNodeType.IsNull:
case SqlNodeType.IsNotNull:
case SqlNodeType.ValueOf:
case SqlNodeType.OuterJoinedValue:
case SqlNodeType.ClrLength:
case SqlNodeType.Add:
case SqlNodeType.Sub:
case SqlNodeType.Mul:
case SqlNodeType.Div:
case SqlNodeType.Mod:
case SqlNodeType.BitAnd:
case SqlNodeType.BitOr:
case SqlNodeType.BitXor:
case SqlNodeType.And:
case SqlNodeType.Or:
case SqlNodeType.GE:
case SqlNodeType.GT:
case SqlNodeType.LE:
case SqlNodeType.LT:
case SqlNodeType.EQ:
case SqlNodeType.NE:
case SqlNodeType.EQ2V:
case SqlNodeType.NE2V:
case SqlNodeType.Between:
case SqlNodeType.Concat:
case SqlNodeType.Convert:
case SqlNodeType.Cast:
case SqlNodeType.Treat:
case SqlNodeType.Member:
case SqlNodeType.TypeCase:
case SqlNodeType.SearchedCase:
case SqlNodeType.SimpleCase:
case SqlNodeType.Like:
case SqlNodeType.FunctionCall:
case SqlNodeType.ExprSet:
case SqlNodeType.OptionalValue:
case SqlNodeType.Parameter:
case SqlNodeType.ColumnRef:
case SqlNodeType.Value:
case SqlNodeType.Variable:
return base.Visit(node);
case SqlNodeType.Column:
case SqlNodeType.ClientCase:
case SqlNodeType.DiscriminatedType:
case SqlNodeType.Link:
case SqlNodeType.Row:
case SqlNodeType.UserQuery:
case SqlNodeType.StoredProcedureCall:
case SqlNodeType.UserRow:
case SqlNodeType.UserColumn:
case SqlNodeType.Multiset:
case SqlNodeType.ScalarSubSelect:
case SqlNodeType.Element:
case SqlNodeType.Exists:
case SqlNodeType.Join:
case SqlNodeType.Select:
case SqlNodeType.New:
case SqlNodeType.ClientQuery:
case SqlNodeType.ClientArray:
case SqlNodeType.Insert:
case SqlNodeType.Update:
case SqlNodeType.Delete:
case SqlNodeType.MemberAssign:
case SqlNodeType.Assign:
case SqlNodeType.Block:
case SqlNodeType.Union:
case SqlNodeType.DoNotVisit:
case SqlNodeType.MethodCall:
case SqlNodeType.Nop:
default:
this.isSimple = false;
return node;
}
}
}
}
}
// 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
- AggregateNode.cs
- OutputScopeManager.cs
- Misc.cs
- CultureSpecificCharacterBufferRange.cs
- PreDigestedSignedInfo.cs
- ISessionStateStore.cs
- TypeDescriptor.cs
- DbException.cs
- BaseContextMenu.cs
- ResourceDescriptionAttribute.cs
- BasicViewGenerator.cs
- CorrelationScope.cs
- SmtpCommands.cs
- MonitoringDescriptionAttribute.cs
- Rules.cs
- DataReceivedEventArgs.cs
- CustomValidator.cs
- Rules.cs
- MDIWindowDialog.cs
- CharacterBufferReference.cs
- ProcessModule.cs
- JulianCalendar.cs
- DataGridViewComboBoxColumn.cs
- EventProviderTraceListener.cs
- ContextStack.cs
- ProfileServiceManager.cs
- CodeMemberEvent.cs
- HtmlTernaryTree.cs
- TraceShell.cs
- MenuItem.cs
- List.cs
- MeasureItemEvent.cs
- TypedOperationInfo.cs
- ToolStripItemTextRenderEventArgs.cs
- DecoderBestFitFallback.cs
- NullExtension.cs
- JulianCalendar.cs
- EventProviderTraceListener.cs
- QilFunction.cs
- PrimitiveCodeDomSerializer.cs
- IntermediatePolicyValidator.cs
- DBCommandBuilder.cs
- ThreadExceptionEvent.cs
- LogSwitch.cs
- XmlSchemaType.cs
- ToolStripItemBehavior.cs
- SQLGuid.cs
- PeerInvitationResponse.cs
- DataTableReader.cs
- DoubleConverter.cs
- XamlGridLengthSerializer.cs
- ScrollBar.cs
- ShapeTypeface.cs
- PathTooLongException.cs
- Attributes.cs
- X509ClientCertificateAuthentication.cs
- Cursor.cs
- ScrollBar.cs
- RectKeyFrameCollection.cs
- FigureParagraph.cs
- UpdateManifestForBrowserApplication.cs
- MetadataCacheItem.cs
- webproxy.cs
- TreeNodeBindingCollection.cs
- Rect3DValueSerializer.cs
- ITreeGenerator.cs
- IndexedDataBuffer.cs
- XmlNullResolver.cs
- ScriptServiceAttribute.cs
- PeerSecurityHelpers.cs
- EventLogger.cs
- DiagnosticsConfiguration.cs
- SqlNotificationRequest.cs
- ToolTipService.cs
- MatrixAnimationUsingKeyFrames.cs
- TokenBasedSet.cs
- DrawingServices.cs
- PageHandlerFactory.cs
- EncoderBestFitFallback.cs
- AnnotationMap.cs
- ObjectListComponentEditor.cs
- InkCollectionBehavior.cs
- DocumentXPathNavigator.cs
- TCPListener.cs
- ManipulationLogic.cs
- Object.cs
- XmlEntity.cs
- ConnectivityStatus.cs
- CornerRadius.cs
- AnnotationStore.cs
- MenuItemBinding.cs
- IncrementalHitTester.cs
- DefaultProxySection.cs
- ReachDocumentReferenceCollectionSerializer.cs
- EntityDataSourceWrapperPropertyDescriptor.cs
- CalendarButtonAutomationPeer.cs
- tooltip.cs
- DataStorage.cs
- OleDbDataAdapter.cs
- ErrorReporting.cs