Code:
/ 4.0 / 4.0 / 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. 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
- ProfileWorkflowElement.cs
- ProcessInputEventArgs.cs
- DbParameterCollection.cs
- codemethodreferenceexpression.cs
- OdbcTransaction.cs
- NetworkInterface.cs
- ZipIOZip64EndOfCentralDirectoryBlock.cs
- ConfigurationPropertyAttribute.cs
- IdentityManager.cs
- TextStore.cs
- InputScopeConverter.cs
- TabControlAutomationPeer.cs
- SafeCryptContextHandle.cs
- SchemaNamespaceManager.cs
- SqlProfileProvider.cs
- DataTemplateSelector.cs
- CqlGenerator.cs
- XmlToDatasetMap.cs
- HttpGetProtocolReflector.cs
- EventProxy.cs
- HttpHandlerActionCollection.cs
- DataGridViewMethods.cs
- TemplateXamlParser.cs
- IOThreadTimer.cs
- MimeMultiPart.cs
- StringFreezingAttribute.cs
- RC2CryptoServiceProvider.cs
- PartialList.cs
- PersonalizationState.cs
- XmlSchemaCollection.cs
- GridViewRowEventArgs.cs
- SqlUtils.cs
- InfoCardRSAPKCS1KeyExchangeFormatter.cs
- Thread.cs
- FilteredSchemaElementLookUpTable.cs
- Calendar.cs
- peersecuritysettings.cs
- ProtectedConfigurationProviderCollection.cs
- RightsManagementEncryptedStream.cs
- System.Data_BID.cs
- Vector3dCollection.cs
- DocumentReference.cs
- PolicyLevel.cs
- UniqueEventHelper.cs
- Number.cs
- XsdBuildProvider.cs
- TemplateBindingExtensionConverter.cs
- StyleSheetDesigner.cs
- SymLanguageVendor.cs
- DigestTraceRecordHelper.cs
- BuildProviderInstallComponent.cs
- ToolStripPanelCell.cs
- IpcChannel.cs
- ProvideValueServiceProvider.cs
- ObjectListField.cs
- SqlNotificationEventArgs.cs
- WinFormsSecurity.cs
- CodeLinePragma.cs
- ZipPackage.cs
- TraceContext.cs
- XmlSchemaAnnotated.cs
- DesignSurfaceManager.cs
- HttpHandlersSection.cs
- SqlDataSourceCommandEventArgs.cs
- XmlValueConverter.cs
- Statements.cs
- DataBindingCollection.cs
- ConfigXmlAttribute.cs
- Int32CollectionConverter.cs
- MemoryPressure.cs
- GroupDescription.cs
- GridLength.cs
- ValidationEventArgs.cs
- PingOptions.cs
- HealthMonitoringSectionHelper.cs
- TypeInfo.cs
- WinFormsSecurity.cs
- TcpChannelFactory.cs
- Wizard.cs
- TextReturnReader.cs
- SingleStorage.cs
- SyntaxCheck.cs
- HyperLinkField.cs
- WebServiceBindingAttribute.cs
- ToolboxComponentsCreatedEventArgs.cs
- ScriptManager.cs
- CommandSet.cs
- XmlTextEncoder.cs
- DataViewManagerListItemTypeDescriptor.cs
- PageVisual.cs
- CheckBoxList.cs
- SQLInt16Storage.cs
- FixedSOMFixedBlock.cs
- ProfileBuildProvider.cs
- CodePageEncoding.cs
- DecimalStorage.cs
- MethodBuilderInstantiation.cs
- FieldToken.cs
- XmlSchemaException.cs
- ReferenceEqualityComparer.cs