Code:
/ 4.0 / 4.0 / 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.
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
- RealizationContext.cs
- DataSourceXmlSubItemAttribute.cs
- HtmlTableCell.cs
- AppDomainFactory.cs
- ExtendLockAsyncResult.cs
- ResourceContainer.cs
- InvalidPropValue.cs
- CodeMemberProperty.cs
- OptimizedTemplateContent.cs
- EventKeyword.cs
- DtdParser.cs
- SerialErrors.cs
- HyperLinkColumn.cs
- CustomAttribute.cs
- TrustSection.cs
- httpapplicationstate.cs
- List.cs
- SecurityDocument.cs
- CompilationLock.cs
- BounceEase.cs
- DataObjectAttribute.cs
- Int64Storage.cs
- InputLangChangeEvent.cs
- InvalidDataException.cs
- XmlSchemaAppInfo.cs
- CallbackBehaviorAttribute.cs
- FixedSOMLineRanges.cs
- CustomLineCap.cs
- EditorBrowsableAttribute.cs
- Win32Exception.cs
- TraversalRequest.cs
- RelatedPropertyManager.cs
- ResourcesBuildProvider.cs
- ListItemConverter.cs
- TerminatingOperationBehavior.cs
- SiteMapDesignerDataSourceView.cs
- StrongNameUtility.cs
- CryptoConfig.cs
- AsynchronousChannelMergeEnumerator.cs
- NegotiationTokenAuthenticator.cs
- ComEventsInfo.cs
- ToolStripSeparator.cs
- DataAdapter.cs
- FacetEnabledSchemaElement.cs
- DBDataPermission.cs
- DiscreteKeyFrames.cs
- QilCloneVisitor.cs
- SpotLight.cs
- DisplayClaim.cs
- DropDownList.cs
- ZoneLinkButton.cs
- SectionInput.cs
- QuestionEventArgs.cs
- AnimationStorage.cs
- CompoundFileReference.cs
- ResourcePermissionBaseEntry.cs
- CacheOutputQuery.cs
- EntityClientCacheEntry.cs
- TdsParserSafeHandles.cs
- MatrixUtil.cs
- DataBindingCollection.cs
- FileRecordSequenceHelper.cs
- SpecialFolderEnumConverter.cs
- TextModifier.cs
- DataGridViewLinkCell.cs
- XD.cs
- SqlBinder.cs
- BinHexEncoder.cs
- RoutingChannelExtension.cs
- SqlCacheDependencyDatabase.cs
- MonikerBuilder.cs
- ChangePassword.cs
- BidOverLoads.cs
- SoapFormatExtensions.cs
- SmtpReplyReaderFactory.cs
- BinaryCommonClasses.cs
- AssemblyCache.cs
- EdmProviderManifest.cs
- XmlValueConverter.cs
- HttpApplicationStateBase.cs
- NamespaceExpr.cs
- DecimalFormatter.cs
- SerializationInfo.cs
- Animatable.cs
- Helper.cs
- Tokenizer.cs
- GenericsInstances.cs
- MailWriter.cs
- CngAlgorithmGroup.cs
- PrintPreviewGraphics.cs
- WebBrowserContainer.cs
- TextBoxLine.cs
- QilXmlWriter.cs
- PublisherIdentityPermission.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- FormatterServicesNoSerializableCheck.cs
- ZoomPercentageConverter.cs
- BehaviorDragDropEventArgs.cs
- SolidColorBrush.cs
- FixedStringLookup.cs