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
- RichTextBox.cs
- DocumentApplication.cs
- ClickablePoint.cs
- HtmlTableRowCollection.cs
- Dynamic.cs
- RootBuilder.cs
- GifBitmapDecoder.cs
- HtmlFormWrapper.cs
- Update.cs
- Control.cs
- TableLayoutColumnStyleCollection.cs
- ProjectionPruner.cs
- BaseDataList.cs
- Normalization.cs
- TypeInitializationException.cs
- SiteMapNodeItemEventArgs.cs
- TextBox.cs
- XmlSchemaAttributeGroup.cs
- SoapHeaders.cs
- AnimationClock.cs
- OleDbReferenceCollection.cs
- ParenthesizePropertyNameAttribute.cs
- ImageCodecInfo.cs
- XmlSchemaInclude.cs
- Triangle.cs
- AdobeCFFWrapper.cs
- Imaging.cs
- DataTransferEventArgs.cs
- DynamicValueConverter.cs
- DynamicILGenerator.cs
- MenuItemBindingCollection.cs
- InternalResources.cs
- StorageComplexTypeMapping.cs
- AmbiguousMatchException.cs
- MessageBox.cs
- SafeRightsManagementHandle.cs
- SByteConverter.cs
- SecurityContext.cs
- XappLauncher.cs
- EdmType.cs
- XsltSettings.cs
- EntityClassGenerator.cs
- MenuItem.cs
- Viewport3DAutomationPeer.cs
- COSERVERINFO.cs
- CodeEntryPointMethod.cs
- LineGeometry.cs
- TextMetrics.cs
- PenCursorManager.cs
- ContextToken.cs
- HostingMessageProperty.cs
- XmlComplianceUtil.cs
- NeutralResourcesLanguageAttribute.cs
- DoubleCollection.cs
- XslTransform.cs
- MimeReturn.cs
- DesignerPerfEventProvider.cs
- ConfigurationFileMap.cs
- DynamicValidatorEventArgs.cs
- IEnumerable.cs
- AttributeUsageAttribute.cs
- TextFormatterImp.cs
- ZipIOExtraFieldElement.cs
- ReferenceService.cs
- AccessDataSource.cs
- DiscoveryRequestHandler.cs
- KeyValuePair.cs
- ColorPalette.cs
- ScriptServiceAttribute.cs
- COM2IManagedPerPropertyBrowsingHandler.cs
- HostingEnvironmentWrapper.cs
- TemplateEditingService.cs
- DataViewManager.cs
- SingletonInstanceContextProvider.cs
- ButtonStandardAdapter.cs
- ThreadSafeList.cs
- BoolExpressionVisitors.cs
- DateTimeEditor.cs
- SqlBulkCopyColumnMapping.cs
- HitTestParameters.cs
- WebConfigurationFileMap.cs
- TableLayoutPanelCellPosition.cs
- KeyInterop.cs
- LightweightEntityWrapper.cs
- DataControlButton.cs
- MultiAsyncResult.cs
- TextFormatterContext.cs
- FormsAuthenticationEventArgs.cs
- SingleAnimationBase.cs
- StringReader.cs
- Encoder.cs
- VirtualPath.cs
- XPathDocumentNavigator.cs
- ThumbAutomationPeer.cs
- NotifyIcon.cs
- RemotingAttributes.cs
- GlyphRunDrawing.cs
- PeerInvitationResponse.cs
- DbProviderFactoriesConfigurationHandler.cs
- SatelliteContractVersionAttribute.cs