Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlMethodTransformer.cs / 2 / SqlMethodTransformer.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Linq;
namespace System.Data.Linq.SqlClient {
///
/// After retyping and conversions take place, some functions need to be changed into more suitable calls.
/// Example: LEN -> DATALENGTH for long text types.
///
internal class SqlMethodTransformer : SqlVisitor {
protected SqlFactory sql;
internal SqlMethodTransformer(SqlFactory sql) {
this.sql = sql;
}
internal override SqlExpression VisitFunctionCall(SqlFunctionCall fc) {
// process the arguments
SqlExpression result = base.VisitFunctionCall(fc);
if (result is SqlFunctionCall) {
SqlFunctionCall resultFunctionCall = (SqlFunctionCall)result;
if (resultFunctionCall.Name == "LEN") {
SqlExpression expr = resultFunctionCall.Arguments[0];
if (expr.SqlType.IsLargeType && !expr.SqlType.SupportsLength) {
result = sql.DATALENGTH(expr);
if (expr.SqlType.IsUnicodeType) {
result = sql.ConvertToInt(sql.Divide(result, sql.ValueFromObject(2, expr.SourceExpression)));
}
}
}
// If the return type of the sql function is not compatible with
// the expected CLR type of the function, inject a conversion. This
// step must be performed AFTER SqlRetyper has run.
Type clrType = resultFunctionCall.SqlType.GetClosestRuntimeType();
bool skipConversion = SqlMethodTransformer.SkipConversionForDateAdd(resultFunctionCall.Name,
resultFunctionCall.ClrType,
clrType);
if ((resultFunctionCall.ClrType != clrType) && !skipConversion) {
result = sql.ConvertTo(resultFunctionCall.ClrType, resultFunctionCall);
}
}
return result;
}
internal override SqlExpression VisitUnaryOperator(SqlUnary fc) {
// process the arguments
SqlExpression result = base.VisitUnaryOperator(fc);
if (result is SqlUnary) {
SqlUnary unary = (SqlUnary)result;
switch (unary.NodeType) {
case SqlNodeType.ClrLength:
SqlExpression expr = unary.Operand;
result = sql.DATALENGTH(expr);
if (expr.SqlType.IsUnicodeType) {
result = sql.Divide(result, sql.ValueFromObject(2, expr.SourceExpression));
}
result = sql.ConvertToInt(result);
break;
default:
break;
}
}
return result;
}
// We don't inject a conversion for DATEADD if doing so will downgrade the result to
// a less precise type.
//
private static bool SkipConversionForDateAdd(string functionName, Type expected, Type actual) {
if (string.Compare(functionName, "DATEADD", StringComparison.OrdinalIgnoreCase) != 0)
return false;
return (expected == typeof(DateTime) && actual == typeof(DateTimeOffset));
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Linq;
namespace System.Data.Linq.SqlClient {
///
/// After retyping and conversions take place, some functions need to be changed into more suitable calls.
/// Example: LEN -> DATALENGTH for long text types.
///
internal class SqlMethodTransformer : SqlVisitor {
protected SqlFactory sql;
internal SqlMethodTransformer(SqlFactory sql) {
this.sql = sql;
}
internal override SqlExpression VisitFunctionCall(SqlFunctionCall fc) {
// process the arguments
SqlExpression result = base.VisitFunctionCall(fc);
if (result is SqlFunctionCall) {
SqlFunctionCall resultFunctionCall = (SqlFunctionCall)result;
if (resultFunctionCall.Name == "LEN") {
SqlExpression expr = resultFunctionCall.Arguments[0];
if (expr.SqlType.IsLargeType && !expr.SqlType.SupportsLength) {
result = sql.DATALENGTH(expr);
if (expr.SqlType.IsUnicodeType) {
result = sql.ConvertToInt(sql.Divide(result, sql.ValueFromObject(2, expr.SourceExpression)));
}
}
}
// If the return type of the sql function is not compatible with
// the expected CLR type of the function, inject a conversion. This
// step must be performed AFTER SqlRetyper has run.
Type clrType = resultFunctionCall.SqlType.GetClosestRuntimeType();
bool skipConversion = SqlMethodTransformer.SkipConversionForDateAdd(resultFunctionCall.Name,
resultFunctionCall.ClrType,
clrType);
if ((resultFunctionCall.ClrType != clrType) && !skipConversion) {
result = sql.ConvertTo(resultFunctionCall.ClrType, resultFunctionCall);
}
}
return result;
}
internal override SqlExpression VisitUnaryOperator(SqlUnary fc) {
// process the arguments
SqlExpression result = base.VisitUnaryOperator(fc);
if (result is SqlUnary) {
SqlUnary unary = (SqlUnary)result;
switch (unary.NodeType) {
case SqlNodeType.ClrLength:
SqlExpression expr = unary.Operand;
result = sql.DATALENGTH(expr);
if (expr.SqlType.IsUnicodeType) {
result = sql.Divide(result, sql.ValueFromObject(2, expr.SourceExpression));
}
result = sql.ConvertToInt(result);
break;
default:
break;
}
}
return result;
}
// We don't inject a conversion for DATEADD if doing so will downgrade the result to
// a less precise type.
//
private static bool SkipConversionForDateAdd(string functionName, Type expected, Type actual) {
if (string.Compare(functionName, "DATEADD", StringComparison.OrdinalIgnoreCase) != 0)
return false;
return (expected == typeof(DateTime) && actual == typeof(DateTimeOffset));
}
}
}
// 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
- UrlPath.cs
- DataShape.cs
- XmlSignatureManifest.cs
- DynamicRenderer.cs
- DynamicControl.cs
- DataGridViewCellEventArgs.cs
- DetailsViewCommandEventArgs.cs
- GradientStop.cs
- EventRoute.cs
- EncoderParameter.cs
- Identity.cs
- UIElementIsland.cs
- ConnectionsZoneDesigner.cs
- PolicyStatement.cs
- WpfKnownMemberInvoker.cs
- BypassElement.cs
- AdRotator.cs
- WorkflowQueuingService.cs
- SplitterPanelDesigner.cs
- AutomationPeer.cs
- InsufficientMemoryException.cs
- ObjectStateManager.cs
- SystemWebCachingSectionGroup.cs
- GeneralTransform3DCollection.cs
- WorkflowMarkupSerializerMapping.cs
- DriveNotFoundException.cs
- CommonDialog.cs
- CompiledQueryCacheEntry.cs
- SqlProviderManifest.cs
- SqlCommand.cs
- Hashtable.cs
- _CommandStream.cs
- XmlSchemaException.cs
- IDQuery.cs
- FormViewPageEventArgs.cs
- WCFBuildProvider.cs
- ApplicationGesture.cs
- DataGridDesigner.cs
- Header.cs
- HtmlButton.cs
- DispatcherHooks.cs
- Itemizer.cs
- WCFModelStrings.Designer.cs
- CodeParameterDeclarationExpression.cs
- MessageDescriptionCollection.cs
- securitymgrsite.cs
- PropertyConverter.cs
- FontInfo.cs
- Label.cs
- SvcMapFileSerializer.cs
- RouteData.cs
- ActivityCodeGenerator.cs
- SecurityUtils.cs
- ServiceHostingEnvironment.cs
- Geometry3D.cs
- VisualTreeUtils.cs
- ReceiveSecurityHeaderElementManager.cs
- PackWebResponse.cs
- DefaultProxySection.cs
- BlobPersonalizationState.cs
- SinglePageViewer.cs
- DecoderExceptionFallback.cs
- Point3DCollectionConverter.cs
- RankException.cs
- CacheRequest.cs
- DetailsViewDeleteEventArgs.cs
- ReadOnlyMetadataCollection.cs
- ContourSegment.cs
- DoubleLinkListEnumerator.cs
- OptimizedTemplateContentHelper.cs
- UmAlQuraCalendar.cs
- ErrorReporting.cs
- CompositionTarget.cs
- ConfigPathUtility.cs
- WebServiceMethodData.cs
- SecurityUtils.cs
- Pair.cs
- ContractTypeNameElement.cs
- BoundingRectTracker.cs
- RemotingServices.cs
- DependentList.cs
- RangeBaseAutomationPeer.cs
- ResizeGrip.cs
- SettingsAttributeDictionary.cs
- SymbolDocumentInfo.cs
- WebControl.cs
- StructuralObject.cs
- AliasGenerator.cs
- DataTableMappingCollection.cs
- ManipulationPivot.cs
- SqlProfileProvider.cs
- GroupQuery.cs
- CheckBoxField.cs
- WbemException.cs
- DependentList.cs
- EmptyElement.cs
- MatrixUtil.cs
- CommentEmitter.cs
- EntryPointNotFoundException.cs
- LayoutExceptionEventArgs.cs