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
- ReplacementText.cs
- Stack.cs
- IdentitySection.cs
- VisualStateManager.cs
- Vector3D.cs
- MultipleViewPattern.cs
- SoapSchemaImporter.cs
- CellTreeNode.cs
- TextDocumentView.cs
- CaseInsensitiveComparer.cs
- ObjectDataSourceSelectingEventArgs.cs
- SpotLight.cs
- ResourceReader.cs
- ClientFormsIdentity.cs
- StrokeCollection2.cs
- TypeDescriptionProvider.cs
- TypeLoadException.cs
- OutputCacheProfileCollection.cs
- ClientScriptManager.cs
- DataMemberFieldEditor.cs
- ClientOptions.cs
- PenLineCapValidation.cs
- Trace.cs
- PlaceHolder.cs
- DispatcherProcessingDisabled.cs
- HostedHttpContext.cs
- AesCryptoServiceProvider.cs
- IntSecurity.cs
- AuthenticationService.cs
- NamespaceListProperty.cs
- TraceUtils.cs
- SectionXmlInfo.cs
- MethodToken.cs
- InputLanguageSource.cs
- StreamInfo.cs
- XpsManager.cs
- DiscardableAttribute.cs
- SafeNativeMethods.cs
- DocumentPageHost.cs
- ParentQuery.cs
- XmlWriter.cs
- MsmqDecodeHelper.cs
- InternalPermissions.cs
- FileLogRecord.cs
- WebEvents.cs
- Literal.cs
- SqlReferenceCollection.cs
- Variant.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- DataGridViewIntLinkedList.cs
- CfgArc.cs
- OperatingSystem.cs
- SessionStateSection.cs
- TimerEventSubscription.cs
- ScriptingProfileServiceSection.cs
- CodeAttributeArgument.cs
- UserControlAutomationPeer.cs
- WebPartConnectionsConnectVerb.cs
- OletxResourceManager.cs
- XmlILConstructAnalyzer.cs
- FlowPanelDesigner.cs
- KeyPressEvent.cs
- ContainerFilterService.cs
- TraceSection.cs
- ColorContextHelper.cs
- NonVisualControlAttribute.cs
- VisualStyleElement.cs
- ToolboxItemFilterAttribute.cs
- AppDomainUnloadedException.cs
- ComplusEndpointConfigContainer.cs
- DataPagerFieldItem.cs
- DataGridViewRowPostPaintEventArgs.cs
- NotFiniteNumberException.cs
- FilterEventArgs.cs
- XhtmlBasicSelectionListAdapter.cs
- PrintPreviewDialog.cs
- ThreadLocal.cs
- LightweightCodeGenerator.cs
- GetWinFXPath.cs
- SuppressMergeCheckAttribute.cs
- MembershipPasswordException.cs
- ClientOperation.cs
- TypeRestriction.cs
- CertificateReferenceElement.cs
- SqlCachedBuffer.cs
- ClientSession.cs
- ReferentialConstraintRoleElement.cs
- Int64Converter.cs
- XmlILIndex.cs
- EdmSchemaError.cs
- TabControlCancelEvent.cs
- EventManager.cs
- CapabilitiesRule.cs
- TypefaceMetricsCache.cs
- TableProviderWrapper.cs
- DataTable.cs
- HMACMD5.cs
- DiscreteKeyFrames.cs
- DataControlField.cs
- ScaleTransform3D.cs