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
- QilGeneratorEnv.cs
- OpacityConverter.cs
- SAPIEngineTypes.cs
- MarkedHighlightComponent.cs
- ClusterSafeNativeMethods.cs
- PeerApplication.cs
- CodeNamespaceImportCollection.cs
- NativeMethods.cs
- ValueCollectionParameterReader.cs
- ListDictionaryInternal.cs
- ListManagerBindingsCollection.cs
- HtmlControlDesigner.cs
- InstanceNameConverter.cs
- EventWaitHandleSecurity.cs
- QilInvokeEarlyBound.cs
- DocumentPageTextView.cs
- WindowsEditBoxRange.cs
- BlurBitmapEffect.cs
- ViewManager.cs
- CodeConditionStatement.cs
- Literal.cs
- ActiveXContainer.cs
- ProxyOperationRuntime.cs
- DesignerTransactionCloseEvent.cs
- SchemaTypeEmitter.cs
- SelectionGlyphBase.cs
- TrustLevelCollection.cs
- PrimitiveXmlSerializers.cs
- BoundField.cs
- ScriptReference.cs
- AssemblyName.cs
- NonParentingControl.cs
- HealthMonitoringSectionHelper.cs
- XpsS0ValidatingLoader.cs
- DbModificationCommandTree.cs
- SafeProcessHandle.cs
- PropertyConverter.cs
- FixedStringLookup.cs
- NullableLongSumAggregationOperator.cs
- SerializationStore.cs
- HtmlForm.cs
- _ListenerAsyncResult.cs
- TimelineClockCollection.cs
- ApplicationContext.cs
- RemoteWebConfigurationHostStream.cs
- MenuAdapter.cs
- ClockController.cs
- TrackingParameters.cs
- CultureInfo.cs
- DataGridViewAdvancedBorderStyle.cs
- Semaphore.cs
- UpdateTracker.cs
- StylusLogic.cs
- CallContext.cs
- PropertyValueChangedEvent.cs
- MergeFilterQuery.cs
- TdsParserStateObject.cs
- DataGridViewSelectedColumnCollection.cs
- InputManager.cs
- RootProfilePropertySettingsCollection.cs
- AVElementHelper.cs
- StorageMappingFragment.cs
- EntityKeyElement.cs
- SqlGenericUtil.cs
- ViewSimplifier.cs
- ListViewCommandEventArgs.cs
- TabletDevice.cs
- ExecutionEngineException.cs
- ListParagraph.cs
- NonSerializedAttribute.cs
- PassportPrincipal.cs
- CombinedGeometry.cs
- RemotingSurrogateSelector.cs
- Style.cs
- ReflectTypeDescriptionProvider.cs
- ComponentChangingEvent.cs
- DeclaredTypeValidator.cs
- ColumnWidthChangingEvent.cs
- DbQueryCommandTree.cs
- PaperSource.cs
- CodeObject.cs
- CustomCategoryAttribute.cs
- IdentifierCollection.cs
- UrlAuthFailureHandler.cs
- HwndSource.cs
- AnimationTimeline.cs
- SourceFileBuildProvider.cs
- CorrelationService.cs
- NeutralResourcesLanguageAttribute.cs
- SmiEventSink_Default.cs
- HWStack.cs
- TagNameToTypeMapper.cs
- CollectionContainer.cs
- ContentOperations.cs
- ObjectContextServiceProvider.cs
- TreeNode.cs
- MSHTMLHostUtil.cs
- InvalidPipelineStoreException.cs
- EntityKey.cs
- StylusPointProperties.cs