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
- NodeCounter.cs
- ToolboxItemCollection.cs
- CommandDesigner.cs
- InternalConfigConfigurationFactory.cs
- WebPartHeaderCloseVerb.cs
- TraceContextEventArgs.cs
- XpsInterleavingPolicy.cs
- ProfileSettingsCollection.cs
- WorkflowApplicationAbortedEventArgs.cs
- XmlSiteMapProvider.cs
- TemplatePropertyEntry.cs
- _ConnectStream.cs
- Message.cs
- FileNotFoundException.cs
- OdbcConnectionStringbuilder.cs
- DefaultValueTypeConverter.cs
- followingquery.cs
- InputLanguage.cs
- CryptoStream.cs
- XXXInfos.cs
- ParseHttpDate.cs
- NodeLabelEditEvent.cs
- XmlDictionaryWriter.cs
- AutomationElementCollection.cs
- PersonalizationDictionary.cs
- NetworkAddressChange.cs
- IriParsingElement.cs
- ViewStateAttachedPropertyFeature.cs
- CustomGrammar.cs
- Clock.cs
- OleDbConnectionFactory.cs
- StyleCollectionEditor.cs
- HTMLTagNameToTypeMapper.cs
- StatusBarAutomationPeer.cs
- SiteMapPath.cs
- ObjectDataSource.cs
- Helper.cs
- Misc.cs
- DataGridViewDataConnection.cs
- DataRelation.cs
- ping.cs
- EventPropertyMap.cs
- DeferredBinaryDeserializerExtension.cs
- ToolStripPanel.cs
- ZipIOLocalFileDataDescriptor.cs
- DecoderExceptionFallback.cs
- DynamicResourceExtensionConverter.cs
- PrimaryKeyTypeConverter.cs
- EdmItemCollection.OcAssemblyCache.cs
- _emptywebproxy.cs
- ScalarRestriction.cs
- COM2ExtendedBrowsingHandler.cs
- MetaModel.cs
- HostingPreferredMapPath.cs
- InstanceHandleConflictException.cs
- Nullable.cs
- LoadWorkflowByInstanceKeyCommand.cs
- SoapSchemaImporter.cs
- X500Name.cs
- EntityDataSourceWrapper.cs
- FSWPathEditor.cs
- EventManager.cs
- TrackingServices.cs
- TableLayout.cs
- DesignerWithHeader.cs
- PageHandlerFactory.cs
- OleDbEnumerator.cs
- RemotingConfiguration.cs
- dataobject.cs
- DbQueryCommandTree.cs
- SystemInformation.cs
- ContentFileHelper.cs
- WebGetAttribute.cs
- PerformanceCounterLib.cs
- ProcessInfo.cs
- Set.cs
- NonSerializedAttribute.cs
- UserControlBuildProvider.cs
- Vector3DCollectionValueSerializer.cs
- PropertyNames.cs
- BorderGapMaskConverter.cs
- CustomCredentialPolicy.cs
- NameSpaceExtractor.cs
- ToolboxCategory.cs
- PhonemeEventArgs.cs
- XmlSchemaSimpleContentRestriction.cs
- XmlSignificantWhitespace.cs
- EndGetFileNameFromUserRequest.cs
- HttpResponseHeader.cs
- Property.cs
- StreamHelper.cs
- XmlIlVisitor.cs
- MarkupProperty.cs
- TimeSpanFormat.cs
- XmlParserContext.cs
- HiddenFieldPageStatePersister.cs
- ThreadExceptionEvent.cs
- PrintController.cs
- WindowsRichEditRange.cs
- EasingKeyFrames.cs