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
- WebBrowserContainer.cs
- PassportIdentity.cs
- HttpException.cs
- StrokeNodeEnumerator.cs
- AppDomainManager.cs
- ProfileInfo.cs
- UnionQueryOperator.cs
- ObjectKeyFrameCollection.cs
- IISUnsafeMethods.cs
- NativeMethods.cs
- SpeechDetectedEventArgs.cs
- CompoundFileReference.cs
- XmlUtf8RawTextWriter.cs
- OleDbSchemaGuid.cs
- RSAPKCS1SignatureFormatter.cs
- FamilyCollection.cs
- TreeWalkHelper.cs
- HitTestResult.cs
- basemetadatamappingvisitor.cs
- ProofTokenCryptoHandle.cs
- WebPartHelpVerb.cs
- ClientRoleProvider.cs
- PropertyRecord.cs
- Context.cs
- WebServiceReceive.cs
- TransportSecurityProtocolFactory.cs
- TabPanel.cs
- HostedImpersonationContext.cs
- DrawTreeNodeEventArgs.cs
- HttpModule.cs
- ModifierKeysConverter.cs
- TextInfo.cs
- ScrollPattern.cs
- CodePrimitiveExpression.cs
- IdleTimeoutMonitor.cs
- securestring.cs
- SymmetricKey.cs
- StyleBamlRecordReader.cs
- WebUtil.cs
- DataGridViewTopRowAccessibleObject.cs
- WebPartMenu.cs
- DependentList.cs
- PriorityQueue.cs
- XpsFixedPageReaderWriter.cs
- RSAOAEPKeyExchangeDeformatter.cs
- NavigationProgressEventArgs.cs
- WpfGeneratedKnownTypes.cs
- SmtpClient.cs
- DaylightTime.cs
- FullTrustAssembliesSection.cs
- Renderer.cs
- Pkcs7Signer.cs
- EventEntry.cs
- ArraySubsetEnumerator.cs
- SqlDataSourceSelectingEventArgs.cs
- HandleValueEditor.cs
- FileDialogCustomPlace.cs
- RubberbandSelector.cs
- Pen.cs
- ProcessHostServerConfig.cs
- XslTransform.cs
- SessionEndingEventArgs.cs
- DirectoryRedirect.cs
- SqlBuilder.cs
- Stack.cs
- MutexSecurity.cs
- Column.cs
- InkCanvasSelection.cs
- ObjectAssociationEndMapping.cs
- WebPartDisplayModeEventArgs.cs
- _OverlappedAsyncResult.cs
- RefExpr.cs
- TransferRequestHandler.cs
- StateRuntime.cs
- Model3DGroup.cs
- DllNotFoundException.cs
- FixedHighlight.cs
- FormViewCommandEventArgs.cs
- SubpageParaClient.cs
- MarkerProperties.cs
- HtmlTextArea.cs
- DictionaryEntry.cs
- DataSourceHelper.cs
- XsdDateTime.cs
- CodeTypeDelegate.cs
- ObjectContext.cs
- _LocalDataStoreMgr.cs
- XsdDateTime.cs
- ElementNotEnabledException.cs
- AvTraceDetails.cs
- HandlerFactoryWrapper.cs
- MultiPageTextView.cs
- AttributeCollection.cs
- CodeArrayIndexerExpression.cs
- unsafenativemethodsother.cs
- SafeRegistryHandle.cs
- NegotiateStream.cs
- ConfigurationProperty.cs
- EventLogPermissionEntry.cs
- DefaultPropertyAttribute.cs