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
- DataExpression.cs
- XmlSchemaDatatype.cs
- RootBrowserWindowProxy.cs
- xsdvalidator.cs
- XsltContext.cs
- SqlTypesSchemaImporter.cs
- MailSettingsSection.cs
- XmlComment.cs
- AlignmentYValidation.cs
- TreeViewTemplateSelector.cs
- SoapException.cs
- OperationCanceledException.cs
- StrongNameIdentityPermission.cs
- TemplateControlCodeDomTreeGenerator.cs
- XmlBinaryReader.cs
- TiffBitmapDecoder.cs
- WebConfigurationManager.cs
- ProgressBarBrushConverter.cs
- TextWriterEngine.cs
- WebScriptEndpoint.cs
- FeedUtils.cs
- DocumentGrid.cs
- GACIdentityPermission.cs
- RectangleF.cs
- TimeZoneNotFoundException.cs
- StructuralCache.cs
- ApplicationFileParser.cs
- GridProviderWrapper.cs
- Variable.cs
- RegexCompilationInfo.cs
- ELinqQueryState.cs
- ConfigurationConverterBase.cs
- CopyOfAction.cs
- ConnectivityStatus.cs
- InvalidPrinterException.cs
- QueueProcessor.cs
- CmsUtils.cs
- NetSectionGroup.cs
- metadatamappinghashervisitor.cs
- TextMarkerSource.cs
- OptionalColumn.cs
- FactoryMaker.cs
- ForeignConstraint.cs
- Int32KeyFrameCollection.cs
- NonSerializedAttribute.cs
- TabControlCancelEvent.cs
- DropDownButton.cs
- EasingKeyFrames.cs
- PointUtil.cs
- ListViewPagedDataSource.cs
- WebPartVerb.cs
- ParameterElementCollection.cs
- TextElementEnumerator.cs
- ArrayWithOffset.cs
- Inline.cs
- TextCompositionManager.cs
- ImportDesigner.xaml.cs
- BaseDataBoundControlDesigner.cs
- MiniConstructorInfo.cs
- SqlUtils.cs
- DivideByZeroException.cs
- XMLSyntaxException.cs
- PopOutPanel.cs
- Viewport3DVisual.cs
- LineServicesCallbacks.cs
- JsonFormatGeneratorStatics.cs
- DBNull.cs
- SubordinateTransaction.cs
- XamlPathDataSerializer.cs
- SmtpNtlmAuthenticationModule.cs
- CellParagraph.cs
- NavigateEvent.cs
- RadioButton.cs
- SqlResolver.cs
- SelectionHighlightInfo.cs
- ReferenceEqualityComparer.cs
- ListItem.cs
- CardSpacePolicyElement.cs
- CursorConverter.cs
- ConnectionConsumerAttribute.cs
- StylusEditingBehavior.cs
- SchemaImporter.cs
- KeyNotFoundException.cs
- ReadOnlyHierarchicalDataSourceView.cs
- PerformanceCounterManager.cs
- ConvertTextFrag.cs
- NamespaceMapping.cs
- Button.cs
- SqlClientPermission.cs
- ControlPropertyNameConverter.cs
- PieceDirectory.cs
- Compiler.cs
- ZipIOLocalFileBlock.cs
- ProfileService.cs
- SqlClientMetaDataCollectionNames.cs
- VerticalConnector.xaml.cs
- TransformGroup.cs
- ExpiredSecurityTokenException.cs
- ImageFormat.cs
- NamedPipeConnectionPool.cs