Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / 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
- IHttpResponseInternal.cs
- UnsafeNativeMethods.cs
- AnnotationResourceCollection.cs
- QilNode.cs
- ParameterCollectionEditor.cs
- codemethodreferenceexpression.cs
- SqlCrossApplyToCrossJoin.cs
- MemberAssignmentAnalysis.cs
- NetSectionGroup.cs
- WebPartChrome.cs
- SafeNativeMethods.cs
- Oid.cs
- coordinatorfactory.cs
- DataKey.cs
- GridViewRowPresenterBase.cs
- EntityViewContainer.cs
- XmlNamespaceMappingCollection.cs
- ImageField.cs
- FlowDocumentPaginator.cs
- ScriptingSectionGroup.cs
- DictionaryTraceRecord.cs
- DynamicILGenerator.cs
- DesignerActionTextItem.cs
- ConvertersCollection.cs
- Literal.cs
- MenuItem.cs
- RecognitionResult.cs
- AlignmentYValidation.cs
- FirstMatchCodeGroup.cs
- CRYPTPROTECT_PROMPTSTRUCT.cs
- EnumMemberAttribute.cs
- WebServiceClientProxyGenerator.cs
- TableProviderWrapper.cs
- CodeMethodInvokeExpression.cs
- EncoderParameters.cs
- DataSourceCacheDurationConverter.cs
- SystemIPInterfaceStatistics.cs
- _ScatterGatherBuffers.cs
- SHA1CryptoServiceProvider.cs
- XmlSerializerFactory.cs
- UriScheme.cs
- RemotingConfigParser.cs
- PathSegment.cs
- HostedTransportConfigurationManager.cs
- ToolStripItemEventArgs.cs
- DefaultTypeArgumentAttribute.cs
- SettingsPropertyValueCollection.cs
- HostedElements.cs
- MdiWindowListItemConverter.cs
- RelAssertionDirectKeyIdentifierClause.cs
- DataViewListener.cs
- ModuleBuilder.cs
- LogReservationCollection.cs
- QueryOperator.cs
- RawContentTypeMapper.cs
- BrowserDefinitionCollection.cs
- TextRenderingModeValidation.cs
- TimeManager.cs
- RenderContext.cs
- CodeObjectCreateExpression.cs
- ReliableDuplexSessionChannel.cs
- TemplateControlParser.cs
- DateTimeSerializationSection.cs
- QueryOperationResponseOfT.cs
- SqlServices.cs
- Int64Animation.cs
- CodeChecksumPragma.cs
- InternalResources.cs
- RequiredAttributeAttribute.cs
- InkCanvasAutomationPeer.cs
- XPathDocumentBuilder.cs
- BitmapEffectGeneralTransform.cs
- ProfileGroupSettings.cs
- TypeGeneratedEventArgs.cs
- GuidConverter.cs
- ListViewTableCell.cs
- OleDbFactory.cs
- XmlAggregates.cs
- RoleGroupCollection.cs
- WmlLiteralTextAdapter.cs
- RadialGradientBrush.cs
- PersonalizationProviderHelper.cs
- TemplateNameScope.cs
- ModelService.cs
- FunctionQuery.cs
- ColorConverter.cs
- ImageBrush.cs
- DbTransaction.cs
- ValidationResult.cs
- CodeGeneratorOptions.cs
- TextUtf8RawTextWriter.cs
- FixedHighlight.cs
- DateTimeConstantAttribute.cs
- Animatable.cs
- RegexCharClass.cs
- SqlProviderManifest.cs
- PolyLineSegment.cs
- ValidatorCompatibilityHelper.cs
- GregorianCalendar.cs
- _OverlappedAsyncResult.cs