Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- ActivityExecutionWorkItem.cs
- DataGridCell.cs
- Nodes.cs
- HtmlTitle.cs
- DbProviderFactoriesConfigurationHandler.cs
- SqlDataReaderSmi.cs
- BaseValidator.cs
- ToolStripDropDown.cs
- ApplicationCommands.cs
- DbParameterHelper.cs
- CorrelationActionMessageFilter.cs
- CallTemplateAction.cs
- DecoderFallbackWithFailureFlag.cs
- EntityStoreSchemaFilterEntry.cs
- CheckBoxField.cs
- ExtensionCollection.cs
- ClientSession.cs
- TriggerAction.cs
- _NestedMultipleAsyncResult.cs
- StrongNameUtility.cs
- Point4DConverter.cs
- LinqDataSourceContextEventArgs.cs
- RedirectionProxy.cs
- ExpandableObjectConverter.cs
- ScriptResourceDefinition.cs
- PathSegment.cs
- TabletDeviceInfo.cs
- ContextStaticAttribute.cs
- Section.cs
- RootProfilePropertySettingsCollection.cs
- SafeFileMappingHandle.cs
- XmlSignificantWhitespace.cs
- SystemKeyConverter.cs
- TagNameToTypeMapper.cs
- DiagnosticsConfigurationHandler.cs
- CodeCommentStatementCollection.cs
- VisualProxy.cs
- ProjectionPath.cs
- ContainerParagraph.cs
- MasterPageCodeDomTreeGenerator.cs
- TimeSpanValidatorAttribute.cs
- PropertyPathWorker.cs
- StateMachineAction.cs
- RegexInterpreter.cs
- CharacterMetrics.cs
- WebConfigurationManager.cs
- SettingsPropertyNotFoundException.cs
- ManualResetEventSlim.cs
- XPathNavigatorKeyComparer.cs
- CorrelationManager.cs
- SynchronizationContext.cs
- TextBoxAutomationPeer.cs
- NativeActivityContext.cs
- RowUpdatedEventArgs.cs
- DetailsViewUpdatedEventArgs.cs
- MemberAccessException.cs
- ServiceModelDictionary.cs
- RoleManagerEventArgs.cs
- TabOrder.cs
- ServiceBusyException.cs
- DragCompletedEventArgs.cs
- Freezable.cs
- MetabaseReader.cs
- smtppermission.cs
- UserPreferenceChangingEventArgs.cs
- ArrayTypeMismatchException.cs
- HMACMD5.cs
- StateMachine.cs
- BooleanToVisibilityConverter.cs
- SafeCancelMibChangeNotify.cs
- DynamicILGenerator.cs
- LightweightCodeGenerator.cs
- MsmqInputSessionChannel.cs
- DataGridTableCollection.cs
- DataViewSetting.cs
- SchemaTableOptionalColumn.cs
- TextViewDesigner.cs
- DataSetMappper.cs
- _ConnectionGroup.cs
- Propagator.JoinPropagator.cs
- Module.cs
- JsonByteArrayDataContract.cs
- DefinitionUpdate.cs
- WebBrowserSiteBase.cs
- ToggleButtonAutomationPeer.cs
- LongValidator.cs
- TempFiles.cs
- ButtonBase.cs
- MeshGeometry3D.cs
- CodeSubDirectory.cs
- UxThemeWrapper.cs
- XmlSchemaSimpleTypeUnion.cs
- LowerCaseStringConverter.cs
- ListViewSortEventArgs.cs
- RadioButtonList.cs
- ChildChangedEventArgs.cs
- InvalidProgramException.cs
- XmlValidatingReaderImpl.cs
- DiagnosticStrings.cs
- BufferedReadStream.cs