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
- _emptywebproxy.cs
- DataGridViewCellStyle.cs
- RegexCompilationInfo.cs
- FixedSOMContainer.cs
- XPathScanner.cs
- SqlAggregateChecker.cs
- WindowCollection.cs
- UIElement.cs
- ConditionChanges.cs
- StructuredProperty.cs
- ConfigurationProperty.cs
- QilGenerator.cs
- PolicyStatement.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- VirtualDirectoryMapping.cs
- XamlHttpHandlerFactory.cs
- SqlAliaser.cs
- DataSourceDescriptorCollection.cs
- Convert.cs
- BooleanConverter.cs
- ResourceDescriptionAttribute.cs
- ConfigurationValues.cs
- BindingMemberInfo.cs
- PrintDocument.cs
- PreservationFileReader.cs
- SecurityContext.cs
- EntitySqlQueryState.cs
- ElapsedEventArgs.cs
- AddDataControlFieldDialog.cs
- SectionRecord.cs
- TraceEventCache.cs
- SecurityHelper.cs
- TextTreePropertyUndoUnit.cs
- remotingproxy.cs
- TableLayoutStyleCollection.cs
- WorkflowRuntimeBehavior.cs
- ComplexTypeEmitter.cs
- TdsParserStaticMethods.cs
- StringConcat.cs
- LogicalTreeHelper.cs
- PatternMatcher.cs
- EnumerableValidator.cs
- Point4D.cs
- DataProviderNameConverter.cs
- PropertyMetadata.cs
- ICspAsymmetricAlgorithm.cs
- FullTextBreakpoint.cs
- EventListenerClientSide.cs
- ChildChangedEventArgs.cs
- ColumnWidthChangingEvent.cs
- FreezableCollection.cs
- StorageInfo.cs
- HttpResponse.cs
- PeerTransportCredentialType.cs
- VirtualizingPanel.cs
- XmlDigitalSignatureProcessor.cs
- MouseDevice.cs
- CustomCredentialPolicy.cs
- CharAnimationUsingKeyFrames.cs
- ResourceLoader.cs
- ResourcePart.cs
- MemberNameValidator.cs
- Enum.cs
- ModifierKeysConverter.cs
- TypeLibraryHelper.cs
- SapiAttributeParser.cs
- DragEvent.cs
- QueueProcessor.cs
- hwndwrapper.cs
- XsltCompileContext.cs
- ReceiveCompletedEventArgs.cs
- CodeBinaryOperatorExpression.cs
- RubberbandSelector.cs
- SequenceNumber.cs
- MobileControl.cs
- ElementMarkupObject.cs
- AsymmetricCryptoHandle.cs
- XsltArgumentList.cs
- CqlErrorHelper.cs
- UserPersonalizationStateInfo.cs
- DataTableNewRowEvent.cs
- SetIndexBinder.cs
- Volatile.cs
- SmtpLoginAuthenticationModule.cs
- SectionInput.cs
- QilXmlWriter.cs
- SvcMapFileSerializer.cs
- MultiByteCodec.cs
- WindowsToolbarItemAsMenuItem.cs
- ConfigXmlWhitespace.cs
- BlockCollection.cs
- WebHttpBindingElement.cs
- LocatorManager.cs
- Attribute.cs
- SortKey.cs
- Matrix3D.cs
- FormViewCommandEventArgs.cs
- ForAllOperator.cs
- PropertyValueUIItem.cs
- ListViewTableRow.cs