Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- OperatingSystemVersionCheck.cs
- StylusDevice.cs
- FunctionImportMapping.cs
- BufferBuilder.cs
- BoundColumn.cs
- QilPatternVisitor.cs
- Thread.cs
- BindingContext.cs
- CompilationLock.cs
- QueryExpression.cs
- ReadOnlyCollectionBase.cs
- Style.cs
- CalendarDay.cs
- EndSelectCardRequest.cs
- HashCodeCombiner.cs
- LineBreak.cs
- ParentQuery.cs
- BehaviorEditorPart.cs
- SafeEventLogWriteHandle.cs
- IRCollection.cs
- WebDescriptionAttribute.cs
- CompiledAction.cs
- Int64.cs
- _SingleItemRequestCache.cs
- OleDbPropertySetGuid.cs
- CompiledIdentityConstraint.cs
- HtmlInputPassword.cs
- WebEventCodes.cs
- Size3DConverter.cs
- FontFamilyValueSerializer.cs
- AttachmentService.cs
- EpmSourcePathSegment.cs
- ImageButton.cs
- HandlerElementCollection.cs
- WebServiceReceiveDesigner.cs
- QuotedStringFormatReader.cs
- GeneralTransform.cs
- OutOfProcStateClientManager.cs
- MaskPropertyEditor.cs
- ValueOfAction.cs
- SmtpNetworkElement.cs
- QualificationDataItem.cs
- LinkButton.cs
- NativeActivityAbortContext.cs
- GradientStop.cs
- SQLRoleProvider.cs
- ModulesEntry.cs
- IListConverters.cs
- ReadWriteSpinLock.cs
- MeshGeometry3D.cs
- TreeNodeCollection.cs
- TreeViewHitTestInfo.cs
- SessionStateSection.cs
- RadioButtonBaseAdapter.cs
- LayoutManager.cs
- CultureTable.cs
- OrderingQueryOperator.cs
- NumberAction.cs
- SHA256Managed.cs
- BuilderInfo.cs
- Section.cs
- DPAPIProtectedConfigurationProvider.cs
- DataTableTypeConverter.cs
- DebugInfoGenerator.cs
- serverconfig.cs
- IgnoreSection.cs
- ScriptControl.cs
- EventArgs.cs
- SqlException.cs
- Vector.cs
- DeploymentSectionCache.cs
- SafeNativeMethods.cs
- BaseCollection.cs
- WindowsEditBoxRange.cs
- TypeSystem.cs
- ScrollChrome.cs
- Documentation.cs
- AnnotationHighlightLayer.cs
- CachingParameterInspector.cs
- RegexGroupCollection.cs
- AuthenticatingEventArgs.cs
- LinkedResource.cs
- RectConverter.cs
- StreamMarshaler.cs
- TextSimpleMarkerProperties.cs
- FileDetails.cs
- TranslateTransform3D.cs
- SynchronizedChannelCollection.cs
- ApplicationHost.cs
- MonitorWrapper.cs
- XD.cs
- FlowDocument.cs
- CombinedGeometry.cs
- InputLanguageEventArgs.cs
- SHA256.cs
- WhileDesigner.xaml.cs
- SectionVisual.cs
- SimpleBitVector32.cs
- MarkupCompilePass1.cs
- SqlRecordBuffer.cs