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
- RadialGradientBrush.cs
- EventHandlersDesigner.cs
- DbParameterHelper.cs
- BoundingRectTracker.cs
- DecoderReplacementFallback.cs
- RegexCompiler.cs
- XmlSchemaAnnotation.cs
- FrameworkTemplate.cs
- Soap.cs
- RepeaterItem.cs
- State.cs
- EntityCollection.cs
- EarlyBoundInfo.cs
- OracleSqlParser.cs
- Attachment.cs
- SqlMethods.cs
- SoapSchemaImporter.cs
- PointLight.cs
- LazyInitializer.cs
- ScrollEventArgs.cs
- ResetableIterator.cs
- FrameworkPropertyMetadata.cs
- SocketConnection.cs
- PathParser.cs
- TimeSpan.cs
- BounceEase.cs
- WebPartUserCapability.cs
- PageCache.cs
- DataGridViewIntLinkedList.cs
- SiteMapHierarchicalDataSourceView.cs
- ProxyHelper.cs
- JobStaple.cs
- FormView.cs
- DialogWindow.cs
- SerializationFieldInfo.cs
- HtmlControl.cs
- EncryptedReference.cs
- CompositeActivityDesigner.cs
- HashMembershipCondition.cs
- pingexception.cs
- Subtree.cs
- BitSet.cs
- DataTableMappingCollection.cs
- Hash.cs
- LocationSectionRecord.cs
- WsatTransactionInfo.cs
- StrokeNodeOperations2.cs
- ThicknessAnimationBase.cs
- XPathBinder.cs
- DataGridViewRowHeightInfoNeededEventArgs.cs
- MruCache.cs
- UInt32.cs
- SqlCacheDependencyDatabase.cs
- AudioBase.cs
- SourceFileInfo.cs
- StateMachineAction.cs
- ListenerConnectionDemuxer.cs
- DbDataRecord.cs
- CodeSubDirectoriesCollection.cs
- DataSourceComponent.cs
- WebPartRestoreVerb.cs
- ToolStripSystemRenderer.cs
- SHA384Managed.cs
- NodeInfo.cs
- ConditionCollection.cs
- CommaDelimitedStringAttributeCollectionConverter.cs
- FillBehavior.cs
- DataServiceOperationContext.cs
- ReflectionHelper.cs
- IODescriptionAttribute.cs
- OptimizerPatterns.cs
- ReflectTypeDescriptionProvider.cs
- ObjectDataSourceMethodEditor.cs
- XmlAttributeOverrides.cs
- HttpCacheVary.cs
- RsaSecurityToken.cs
- SizeAnimationBase.cs
- Int64Converter.cs
- LineGeometry.cs
- Serializer.cs
- DataGridColumnHeadersPresenterAutomationPeer.cs
- mediapermission.cs
- TraceData.cs
- PasswordBoxAutomationPeer.cs
- UserThread.cs
- DoubleAnimationUsingKeyFrames.cs
- SuspendDesigner.cs
- TaskFactory.cs
- TopClause.cs
- HttpsChannelFactory.cs
- Triplet.cs
- FrameAutomationPeer.cs
- Menu.cs
- OutputScopeManager.cs
- QuaternionRotation3D.cs
- SamlEvidence.cs
- CookieParameter.cs
- TypeHelper.cs
- TreeNode.cs
- HierarchicalDataSourceControl.cs