Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlBooleanizer.cs / 1305376 / 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
- ChangesetResponse.cs
- UrlPath.cs
- PageWrapper.cs
- WindowsGraphicsCacheManager.cs
- PageCatalogPart.cs
- XslNumber.cs
- TextServicesHost.cs
- ZoomingMessageFilter.cs
- DecoderFallbackWithFailureFlag.cs
- TerminateSequenceResponse.cs
- SingleAnimationBase.cs
- VerticalAlignConverter.cs
- ObjectConverter.cs
- StateBag.cs
- HostExecutionContextManager.cs
- Visual3D.cs
- XmlSchemaSimpleTypeList.cs
- DirectoryInfo.cs
- XmlException.cs
- StringPropertyBuilder.cs
- Wildcard.cs
- HiddenFieldPageStatePersister.cs
- EntityFunctions.cs
- XmlSchemaSimpleTypeRestriction.cs
- EtwTrace.cs
- ResourcePool.cs
- AuthorizationContext.cs
- MetadataArtifactLoaderFile.cs
- BamlVersionHeader.cs
- translator.cs
- FieldBuilder.cs
- ForceCopyBuildProvider.cs
- ContainerParagraph.cs
- ElementNotAvailableException.cs
- DataGridRow.cs
- DuplexChannelFactory.cs
- LoadItemsEventArgs.cs
- RijndaelManagedTransform.cs
- IndexedString.cs
- SessionEndingEventArgs.cs
- DoubleLinkListEnumerator.cs
- CatalogZoneDesigner.cs
- DataListItemCollection.cs
- EmptyEnumerator.cs
- VisualCollection.cs
- SemanticAnalyzer.cs
- PackagingUtilities.cs
- ToolStripActionList.cs
- ToolTipService.cs
- SponsorHelper.cs
- HTMLTextWriter.cs
- DataGridParentRows.cs
- ExtendedProperty.cs
- DbException.cs
- TextHidden.cs
- RightsManagementPermission.cs
- ColumnMapProcessor.cs
- TemplatedAdorner.cs
- _IPv4Address.cs
- KeyFrames.cs
- Vars.cs
- BaseDataListComponentEditor.cs
- XamlDesignerSerializationManager.cs
- OleDbCommand.cs
- WebReferencesBuildProvider.cs
- ServiceCredentialsSecurityTokenManager.cs
- ExpressionCopier.cs
- SiteMapSection.cs
- StoreAnnotationsMap.cs
- FormsAuthenticationConfiguration.cs
- TableLayoutRowStyleCollection.cs
- WpfXamlLoader.cs
- CacheMode.cs
- DelegateArgument.cs
- BulletedList.cs
- ResolveCriteria11.cs
- PointLight.cs
- XmlDataProvider.cs
- PermissionAttributes.cs
- TrustSection.cs
- FormatConvertedBitmap.cs
- SupportsEventValidationAttribute.cs
- AutoGeneratedField.cs
- Soap.cs
- AutomationPatternInfo.cs
- SerializationInfoEnumerator.cs
- AuthorizationRuleCollection.cs
- _IPv4Address.cs
- OleDbWrapper.cs
- ClientProxyGenerator.cs
- ScriptReference.cs
- Baml6Assembly.cs
- LineUtil.cs
- KeyGestureValueSerializer.cs
- Activity.cs
- OleDbPermission.cs
- WorkflowMarkupSerializerMapping.cs
- XmlConverter.cs
- ObjectItemAttributeAssemblyLoader.cs
- ObjectStateEntryBaseUpdatableDataRecord.cs