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
- WindowProviderWrapper.cs
- ColorKeyFrameCollection.cs
- EncodingNLS.cs
- PointHitTestResult.cs
- ThreadAbortException.cs
- SqlConnectionStringBuilder.cs
- TCEAdapterGenerator.cs
- CapabilitiesUse.cs
- InputLanguage.cs
- SynchronizationLockException.cs
- XmlSchemaIdentityConstraint.cs
- DataKey.cs
- FormatterServices.cs
- ProfilePropertySettings.cs
- NativeWindow.cs
- MeasureData.cs
- OdbcCommand.cs
- ConsoleEntryPoint.cs
- DesignBinding.cs
- DocumentGridPage.cs
- PageThemeParser.cs
- XmlSiteMapProvider.cs
- HttpHandlerActionCollection.cs
- ObjectDataSourceChooseTypePanel.cs
- PropertyItem.cs
- ListenerElementsCollection.cs
- VolatileEnlistmentState.cs
- EncodingNLS.cs
- ConstrainedDataObject.cs
- OdbcDataReader.cs
- SecurityTokenProvider.cs
- ValueUnavailableException.cs
- VerificationException.cs
- Rotation3DAnimation.cs
- RuntimeWrappedException.cs
- Condition.cs
- AliasGenerator.cs
- SqlAliaser.cs
- XmlSchemaSimpleTypeRestriction.cs
- DesignerContextDescriptor.cs
- XmlWriterTraceListener.cs
- PropertyPathConverter.cs
- FixedSOMLineRanges.cs
- WindowsListView.cs
- GrammarBuilderBase.cs
- XamlBrushSerializer.cs
- WSHttpTransportSecurityElement.cs
- ApplicationGesture.cs
- XmlDomTextWriter.cs
- Border.cs
- ChannelManager.cs
- COMException.cs
- StringFormat.cs
- MobileRedirect.cs
- RuleProcessor.cs
- CompressStream.cs
- SectionVisual.cs
- AddInStore.cs
- WebPartHelpVerb.cs
- ArgIterator.cs
- PerformanceCounterPermissionEntryCollection.cs
- CryptoKeySecurity.cs
- DataGridItemCollection.cs
- ThrowHelper.cs
- DoubleAnimationUsingKeyFrames.cs
- BatchWriter.cs
- Subtree.cs
- PlacementWorkspace.cs
- DialogResultConverter.cs
- SqlDataSourceQuery.cs
- Converter.cs
- DataGridViewUtilities.cs
- RequiredFieldValidator.cs
- RadioButtonAutomationPeer.cs
- ListComponentEditor.cs
- DataGridViewAutoSizeModeEventArgs.cs
- LightweightCodeGenerator.cs
- TextLine.cs
- WebPartConnectionsConnectVerb.cs
- SqlAliasesReferenced.cs
- SvcMapFileLoader.cs
- KerberosSecurityTokenProvider.cs
- Compilation.cs
- SoapEnumAttribute.cs
- XmlRawWriter.cs
- HttpContextServiceHost.cs
- ThreadStateException.cs
- SmtpClient.cs
- StaticTextPointer.cs
- SettingsPropertyValue.cs
- SimpleTypeResolver.cs
- ContractMethodInfo.cs
- RootProfilePropertySettingsCollection.cs
- DSASignatureFormatter.cs
- ListControl.cs
- TypeToken.cs
- UnsafeNativeMethods.cs
- ReflectionPermission.cs
- StringSource.cs
- TraceSection.cs