Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlMethodTransformer.cs / 1305376 / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TextRangeProviderWrapper.cs
- SqlDelegatedTransaction.cs
- XsltArgumentList.cs
- OperationCanceledException.cs
- ColumnReorderedEventArgs.cs
- UDPClient.cs
- RightsManagementPermission.cs
- PngBitmapDecoder.cs
- ContainerParagraph.cs
- HtmlEmptyTagControlBuilder.cs
- PathData.cs
- LookupNode.cs
- DynamicObject.cs
- CatalogZone.cs
- DataRecordObjectView.cs
- NativeMethods.cs
- ProcessInfo.cs
- DataGridToolTip.cs
- sqlcontext.cs
- CapabilitiesRule.cs
- TableLayoutCellPaintEventArgs.cs
- ColumnMapTranslator.cs
- DataGridViewToolTip.cs
- IgnoreFileBuildProvider.cs
- ClientUtils.cs
- DeflateEmulationStream.cs
- TimeSpan.cs
- CommandLibraryHelper.cs
- BuildResultCache.cs
- DetailsView.cs
- PromptBuilder.cs
- EastAsianLunisolarCalendar.cs
- altserialization.cs
- StringComparer.cs
- XmlFormatReaderGenerator.cs
- CounterSet.cs
- TextDecorationCollection.cs
- ControlHelper.cs
- PolicyStatement.cs
- TransformationRules.cs
- SafeFileHandle.cs
- ObjectStateEntryDbUpdatableDataRecord.cs
- Size3D.cs
- ServiceDeploymentInfo.cs
- DockPanel.cs
- IntSecurity.cs
- DbConnectionPoolGroup.cs
- UInt16Converter.cs
- IndexedString.cs
- ToolTipService.cs
- ValueQuery.cs
- DrawingVisualDrawingContext.cs
- _FtpDataStream.cs
- StylusPointPropertyUnit.cs
- PerformanceCounterManager.cs
- PeerChannelFactory.cs
- IgnoreFileBuildProvider.cs
- SiteMapNodeItem.cs
- MD5CryptoServiceProvider.cs
- Membership.cs
- MouseButton.cs
- CngAlgorithm.cs
- FilterException.cs
- XmlDataCollection.cs
- ContentHostHelper.cs
- ResourceDictionary.cs
- WindowsStartMenu.cs
- MsmqInputChannelListenerBase.cs
- MdiWindowListItemConverter.cs
- EncryptedKey.cs
- OdbcEnvironmentHandle.cs
- PartialTrustVisibleAssembly.cs
- Effect.cs
- XslException.cs
- AppDomainAttributes.cs
- BigInt.cs
- WebPartConnectionsConfigureVerb.cs
- NetStream.cs
- MailWebEventProvider.cs
- RNGCryptoServiceProvider.cs
- DesignTimeTemplateParser.cs
- QuaternionRotation3D.cs
- ObjectParameter.cs
- FormViewUpdatedEventArgs.cs
- RandomDelayQueuedSendsAsyncResult.cs
- HttpCapabilitiesSectionHandler.cs
- TextBlockAutomationPeer.cs
- DataGridViewTopRowAccessibleObject.cs
- SerializerWriterEventHandlers.cs
- ContextCorrelationInitializer.cs
- Stopwatch.cs
- EmptyControlCollection.cs
- TargetInvocationException.cs
- ProfileInfo.cs
- InternalPermissions.cs
- DisplayInformation.cs
- TraceUtility.cs
- ProfileManager.cs
- TraceSection.cs
- Module.cs