Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlBooleanizer.cs / 2 / 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
- TextFormatterHost.cs
- IteratorDescriptor.cs
- PseudoWebRequest.cs
- AsymmetricKeyExchangeFormatter.cs
- uribuilder.cs
- NameValuePair.cs
- ToggleButtonAutomationPeer.cs
- IncrementalCompileAnalyzer.cs
- XmlComplianceUtil.cs
- StartUpEventArgs.cs
- DetailsViewUpdatedEventArgs.cs
- OracleConnection.cs
- TypeDescriptorContext.cs
- FontSourceCollection.cs
- SqlDataSourceFilteringEventArgs.cs
- SmiRequestExecutor.cs
- EncoderParameters.cs
- OuterGlowBitmapEffect.cs
- Visual.cs
- XmlEncodedRawTextWriter.cs
- ResolveMatchesApril2005.cs
- DBSchemaRow.cs
- TaskbarItemInfo.cs
- Grammar.cs
- TokenBasedSetEnumerator.cs
- DataServiceProviderWrapper.cs
- AspNetSynchronizationContext.cs
- TypefaceCollection.cs
- RangeValueProviderWrapper.cs
- ToolBarButton.cs
- TypeExtension.cs
- ThumbButtonInfo.cs
- Listbox.cs
- ValidateNames.cs
- UpdateProgress.cs
- EditorZone.cs
- entityreference_tresulttype.cs
- FlowPosition.cs
- Switch.cs
- NameSpaceExtractor.cs
- Array.cs
- ConstructorArgumentAttribute.cs
- Queue.cs
- RewritingPass.cs
- SevenBitStream.cs
- ImageSource.cs
- PassportAuthenticationEventArgs.cs
- EntityParameterCollection.cs
- DependencySource.cs
- ToolStripHighContrastRenderer.cs
- Models.cs
- AuthenticationModuleElementCollection.cs
- VirtualizingPanel.cs
- PictureBox.cs
- RequestBringIntoViewEventArgs.cs
- MemoryPressure.cs
- DirectoryGroupQuery.cs
- Visual3D.cs
- DataRelationPropertyDescriptor.cs
- ClientReliableChannelBinder.cs
- ToolStripPanelRow.cs
- DispatcherBuilder.cs
- SimpleRecyclingCache.cs
- BasicViewGenerator.cs
- ExpressionDumper.cs
- SqlProfileProvider.cs
- TemplateLookupAction.cs
- WinFormsSpinner.cs
- ZipIOExtraField.cs
- ImpersonationContext.cs
- DependencyObjectProvider.cs
- ActivityIdHeader.cs
- Vector.cs
- ErrorWrapper.cs
- WebEvents.cs
- CrossContextChannel.cs
- XPathSelfQuery.cs
- TTSEvent.cs
- DurableInstance.cs
- DesignerLabelAdapter.cs
- InputManager.cs
- DoubleConverter.cs
- Pkcs7Signer.cs
- BuildProviderCollection.cs
- DataGridColumnEventArgs.cs
- FormsAuthentication.cs
- HttpInputStream.cs
- Zone.cs
- CharacterHit.cs
- MenuAdapter.cs
- X509Certificate.cs
- CompoundFileStreamReference.cs
- _BufferOffsetSize.cs
- BinaryMethodMessage.cs
- CompiledXpathExpr.cs
- EndpointDiscoveryMetadata11.cs
- XmlCompatibilityReader.cs
- UnionExpr.cs
- FontFamily.cs
- XmlSerializerSection.cs