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 / SqlBooleanizer.cs / 1 / SqlBooleanizer.cs
using System.Data.Linq.Mapping; namespace System.Data.Linq.SqlClient { ////// Locate cases in which there is a 'Bit' but a 'Predicate' is expected or vice-versa. /// Transform these expressions into expressions of the expected type. /// internal class SqlBooleanizer { private class Booleanizer : SqlBooleanMismatchVisitor { private SqlFactory sql; internal Booleanizer(TypeSystemProvider typeProvider, MetaModel model) { this.sql = new SqlFactory(typeProvider, model); } internal override SqlSelect VisitSelect(SqlSelect select) { // DevDiv 179191 if (select.Where != null && select.Where.NodeType == SqlNodeType.Coalesce) { SqlBinary bin = (SqlBinary)select.Where; if (bin.Right.NodeType == SqlNodeType.Value) { SqlValue value = (SqlValue)bin.Right; if (value.Value != null && value.Value.GetType() == typeof(bool) && (bool)value.Value == false) { select.Where = bin.Left; } } } return base.VisitSelect(select); } internal override SqlExpression ConvertValueToPredicate(SqlExpression valueExpression) { // Transform the 'Bit' expression into a 'Predicate' by forming the // following operation: // OriginalExpr = 1 // Yukon and later could also handle: // OriginalExpr = 'true' // but Sql2000 does not support this. return new SqlBinary(SqlNodeType.EQ, valueExpression.ClrType, sql.TypeProvider.From(typeof(bool)), valueExpression, sql.Value(typeof(bool), valueExpression.SqlType, true, false, valueExpression.SourceExpression) ); } internal override SqlExpression ConvertPredicateToValue(SqlExpression predicateExpression) { // Transform the 'Predicate' expression into a 'Bit' by forming the // following operation: // CASE // WHEN predicateExpression THEN 1 // ELSE NOT(predicateExpression) THEN 0 // ELSE NULL // END // Possible simplification to the generated SQL would be to detect when 'predicateExpression' // is SqlUnary(NOT) and use its operand with the literal 1 and 0 below swapped. SqlExpression valueTrue = sql.ValueFromObject(true, false, predicateExpression.SourceExpression); SqlExpression valueFalse = sql.ValueFromObject(false, false, predicateExpression.SourceExpression); if (SqlExpressionNullability.CanBeNull(predicateExpression) != false) { SqlExpression valueNull = sql.Value(valueTrue.ClrType, valueTrue.SqlType, null, false, predicateExpression.SourceExpression); return new SqlSearchedCase( predicateExpression.ClrType, new SqlWhen[] { new SqlWhen(predicateExpression, valueTrue), new SqlWhen(new SqlUnary(SqlNodeType.Not, predicateExpression.ClrType, predicateExpression.SqlType, predicateExpression, predicateExpression.SourceExpression), valueFalse) }, valueNull, predicateExpression.SourceExpression ); } else { return new SqlSearchedCase( predicateExpression.ClrType, new SqlWhen[] { new SqlWhen(predicateExpression, valueTrue) }, valueFalse, predicateExpression.SourceExpression ); } } } ////// Rationalize boolean expressions for the given node. /// internal static SqlNode Rationalize(SqlNode node, TypeSystemProvider typeProvider, MetaModel model) { return new Booleanizer(typeProvider, model).Visit(node); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System.Data.Linq.Mapping; namespace System.Data.Linq.SqlClient { ////// Locate cases in which there is a 'Bit' but a 'Predicate' is expected or vice-versa. /// Transform these expressions into expressions of the expected type. /// internal class SqlBooleanizer { private class Booleanizer : SqlBooleanMismatchVisitor { private SqlFactory sql; internal Booleanizer(TypeSystemProvider typeProvider, MetaModel model) { this.sql = new SqlFactory(typeProvider, model); } internal override SqlSelect VisitSelect(SqlSelect select) { // DevDiv 179191 if (select.Where != null && select.Where.NodeType == SqlNodeType.Coalesce) { SqlBinary bin = (SqlBinary)select.Where; if (bin.Right.NodeType == SqlNodeType.Value) { SqlValue value = (SqlValue)bin.Right; if (value.Value != null && value.Value.GetType() == typeof(bool) && (bool)value.Value == false) { select.Where = bin.Left; } } } return base.VisitSelect(select); } internal override SqlExpression ConvertValueToPredicate(SqlExpression valueExpression) { // Transform the 'Bit' expression into a 'Predicate' by forming the // following operation: // OriginalExpr = 1 // Yukon and later could also handle: // OriginalExpr = 'true' // but Sql2000 does not support this. return new SqlBinary(SqlNodeType.EQ, valueExpression.ClrType, sql.TypeProvider.From(typeof(bool)), valueExpression, sql.Value(typeof(bool), valueExpression.SqlType, true, false, valueExpression.SourceExpression) ); } internal override SqlExpression ConvertPredicateToValue(SqlExpression predicateExpression) { // Transform the 'Predicate' expression into a 'Bit' by forming the // following operation: // CASE // WHEN predicateExpression THEN 1 // ELSE NOT(predicateExpression) THEN 0 // ELSE NULL // END // Possible simplification to the generated SQL would be to detect when 'predicateExpression' // is SqlUnary(NOT) and use its operand with the literal 1 and 0 below swapped. SqlExpression valueTrue = sql.ValueFromObject(true, false, predicateExpression.SourceExpression); SqlExpression valueFalse = sql.ValueFromObject(false, false, predicateExpression.SourceExpression); if (SqlExpressionNullability.CanBeNull(predicateExpression) != false) { SqlExpression valueNull = sql.Value(valueTrue.ClrType, valueTrue.SqlType, null, false, predicateExpression.SourceExpression); return new SqlSearchedCase( predicateExpression.ClrType, new SqlWhen[] { new SqlWhen(predicateExpression, valueTrue), new SqlWhen(new SqlUnary(SqlNodeType.Not, predicateExpression.ClrType, predicateExpression.SqlType, predicateExpression, predicateExpression.SourceExpression), valueFalse) }, valueNull, predicateExpression.SourceExpression ); } else { return new SqlSearchedCase( predicateExpression.ClrType, new SqlWhen[] { new SqlWhen(predicateExpression, valueTrue) }, valueFalse, predicateExpression.SourceExpression ); } } } ////// Rationalize boolean expressions for the given node. /// internal static SqlNode Rationalize(SqlNode node, TypeSystemProvider typeProvider, MetaModel model) { return new Booleanizer(typeProvider, model).Visit(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
- SamlAudienceRestrictionCondition.cs
- ReadOnlyDataSource.cs
- SqlConnectionPoolGroupProviderInfo.cs
- FunctionQuery.cs
- RegexCompiler.cs
- SafeLibraryHandle.cs
- UserControl.cs
- PrivateFontCollection.cs
- WebPartZoneCollection.cs
- ContractInstanceProvider.cs
- GenericXmlSecurityToken.cs
- BuildProviderInstallComponent.cs
- QualificationDataItem.cs
- GroupItem.cs
- CommonXSendMessage.cs
- TextParagraphProperties.cs
- CorruptingExceptionCommon.cs
- XmlDocumentFragment.cs
- Int64.cs
- GlobalAllocSafeHandle.cs
- QilGenerator.cs
- DynamicDataExtensions.cs
- XmlCharacterData.cs
- CloudCollection.cs
- ComNativeDescriptor.cs
- PropertyPanel.cs
- CachingHintValidation.cs
- PolyLineSegmentFigureLogic.cs
- ContainerControl.cs
- SchemaImporter.cs
- CollaborationHelperFunctions.cs
- StrokeNode.cs
- SQLMembershipProvider.cs
- BinaryFormatterWriter.cs
- CustomError.cs
- MultiSelector.cs
- Help.cs
- PreviewPageInfo.cs
- AssemblyBuilder.cs
- FontStyles.cs
- RangeBaseAutomationPeer.cs
- MimePart.cs
- SqlDependencyListener.cs
- PropertyStore.cs
- LicFileLicenseProvider.cs
- DecoderFallbackWithFailureFlag.cs
- StreamWriter.cs
- PageSetupDialog.cs
- WebRequestModuleElementCollection.cs
- InternalsVisibleToAttribute.cs
- NameSpaceExtractor.cs
- DesignTimeParseData.cs
- XmlMemberMapping.cs
- AnnotationResourceChangedEventArgs.cs
- HttpResponseBase.cs
- MouseWheelEventArgs.cs
- WhiteSpaceTrimStringConverter.cs
- SafeFileMapViewHandle.cs
- ObjectRef.cs
- EventTask.cs
- elementinformation.cs
- ServerReliableChannelBinder.cs
- DataServiceHost.cs
- WindowsIPAddress.cs
- Journal.cs
- LabelLiteral.cs
- TypeToTreeConverter.cs
- XamlBuildTaskServices.cs
- TableStyle.cs
- OdbcError.cs
- TypeSystemHelpers.cs
- _TransmitFileOverlappedAsyncResult.cs
- IntellisenseTextBox.designer.cs
- CollectionView.cs
- VarRemapper.cs
- CommonObjectSecurity.cs
- MenuItemCollection.cs
- TableHeaderCell.cs
- ManagementPath.cs
- AsymmetricKeyExchangeDeformatter.cs
- GlobalEventManager.cs
- Wrapper.cs
- RegistryPermission.cs
- PerformanceCounterNameAttribute.cs
- MergablePropertyAttribute.cs
- ClipboardData.cs
- PropertiesTab.cs
- AliasGenerator.cs
- ConfigurationSectionCollection.cs
- HyperLinkField.cs
- TimersDescriptionAttribute.cs
- RoutedEventArgs.cs
- HostSecurityManager.cs
- TemplateKeyConverter.cs
- PropertyChangedEventArgs.cs
- Int64AnimationUsingKeyFrames.cs
- MemberDescriptor.cs
- PrimaryKeyTypeConverter.cs
- SystemWebCachingSectionGroup.cs
- TagPrefixInfo.cs