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
- SecurityResources.cs
- RowsCopiedEventArgs.cs
- _AutoWebProxyScriptHelper.cs
- TypeAccessException.cs
- RuleSetBrowserDialog.cs
- SafeTokenHandle.cs
- AsyncPostBackTrigger.cs
- PixelFormat.cs
- TextProperties.cs
- StyleTypedPropertyAttribute.cs
- HttpCacheVary.cs
- SymmetricAlgorithm.cs
- Pen.cs
- WindowsFont.cs
- KnownTypesHelper.cs
- StringAttributeCollection.cs
- HttpHandlerActionCollection.cs
- SystemInfo.cs
- SchemaTableOptionalColumn.cs
- WebPartHelpVerb.cs
- TableLayoutPanelBehavior.cs
- EntityDescriptor.cs
- XmlILOptimizerVisitor.cs
- OneOfTypeConst.cs
- SuppressMergeCheckAttribute.cs
- DesignTimeTemplateParser.cs
- XamlParser.cs
- ReachSerializer.cs
- PropertyPathConverter.cs
- EnumUnknown.cs
- WebColorConverter.cs
- _NTAuthentication.cs
- CreateSequence.cs
- NameValueCollection.cs
- TiffBitmapDecoder.cs
- XPathSelectionIterator.cs
- CurrentChangingEventManager.cs
- BaseUriHelper.cs
- WindowsScrollBar.cs
- MatrixValueSerializer.cs
- GeneralTransformGroup.cs
- WorkflowMessageEventHandler.cs
- TaskResultSetter.cs
- TextClipboardData.cs
- ValidatedControlConverter.cs
- ApplicationCommands.cs
- DateTimeFormat.cs
- CachedCompositeFamily.cs
- InputScopeAttribute.cs
- WebDescriptionAttribute.cs
- BinaryWriter.cs
- ValueTypeFieldReference.cs
- CompilationLock.cs
- Util.cs
- TextBoxView.cs
- Assert.cs
- ConfigXmlWhitespace.cs
- HierarchicalDataSourceIDConverter.cs
- SafeFileMappingHandle.cs
- PrimitiveCodeDomSerializer.cs
- Point3DCollection.cs
- WSHttpTransportSecurityElement.cs
- DoubleAnimationBase.cs
- RemoveStoryboard.cs
- ByteStack.cs
- SemanticAnalyzer.cs
- TextDecorationUnitValidation.cs
- SecurityTokenException.cs
- SiteMembershipCondition.cs
- Int32.cs
- IsolatedStoragePermission.cs
- Operator.cs
- SqlClientWrapperSmiStream.cs
- EmbeddedObject.cs
- ImportCatalogPart.cs
- ScrollChangedEventArgs.cs
- BaseValidator.cs
- XpsSerializationManager.cs
- SaveFileDialog.cs
- NavigationWindow.cs
- updateconfighost.cs
- ClockController.cs
- Panel.cs
- InternalPermissions.cs
- HtmlInputPassword.cs
- Helper.cs
- XhtmlBasicControlAdapter.cs
- SplayTreeNode.cs
- SqlClientMetaDataCollectionNames.cs
- UserControlAutomationPeer.cs
- RightsManagementEncryptionTransform.cs
- PolicyDesigner.cs
- AuthenticatingEventArgs.cs
- RequestCacheManager.cs
- XmlDictionary.cs
- ErrorHandler.cs
- PeerCollaborationPermission.cs
- TextOnlyOutput.cs
- BamlLocalizer.cs
- AddInStore.cs