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
- ColumnMapTranslator.cs
- MasterPageParser.cs
- TransformValueSerializer.cs
- ForeignKeyConstraint.cs
- RenderDataDrawingContext.cs
- HighContrastHelper.cs
- IntSecurity.cs
- ArgumentNullException.cs
- WorkItem.cs
- SqlInternalConnection.cs
- OdbcCommandBuilder.cs
- PropertyItemInternal.cs
- IdentityManager.cs
- BaseUriHelper.cs
- ExeContext.cs
- BuildProvidersCompiler.cs
- DataControlFieldHeaderCell.cs
- D3DImage.cs
- TypeForwardedToAttribute.cs
- RangeBaseAutomationPeer.cs
- ClientRoleProvider.cs
- NamespaceListProperty.cs
- CodeCastExpression.cs
- ManualResetEvent.cs
- MessageQueueCriteria.cs
- DES.cs
- XmlValidatingReaderImpl.cs
- SqlLiftIndependentRowExpressions.cs
- DetailsView.cs
- StorageEntityContainerMapping.cs
- _ConnectOverlappedAsyncResult.cs
- WebPartCatalogAddVerb.cs
- ScriptReferenceBase.cs
- cryptoapiTransform.cs
- WindowsIdentity.cs
- MatrixTransform3D.cs
- MappingModelBuildProvider.cs
- Accessible.cs
- Nullable.cs
- DataGridToolTip.cs
- ByteStream.cs
- HttpListenerElement.cs
- oledbmetadatacolumnnames.cs
- WebScriptMetadataFormatter.cs
- OutputScopeManager.cs
- ToolStripSystemRenderer.cs
- CredentialCache.cs
- JumpItem.cs
- CatalogPartCollection.cs
- ListBindingHelper.cs
- InvokeAction.cs
- loginstatus.cs
- ReadOnlyCollectionBase.cs
- UriScheme.cs
- WeakHashtable.cs
- XXXInfos.cs
- VisualTransition.cs
- FontUnit.cs
- ResourcePropertyMemberCodeDomSerializer.cs
- ObservableDictionary.cs
- UIntPtr.cs
- AnimatedTypeHelpers.cs
- ModifyActivitiesPropertyDescriptor.cs
- PeerNameRegistration.cs
- WindowsRegion.cs
- PerformanceCounterCategory.cs
- FacetDescriptionElement.cs
- MULTI_QI.cs
- TreeViewDesigner.cs
- DrawListViewItemEventArgs.cs
- ProxyFragment.cs
- CompiledELinqQueryState.cs
- UnionCqlBlock.cs
- HandlerBase.cs
- DrawListViewSubItemEventArgs.cs
- TransactionProtocol.cs
- SrgsItemList.cs
- TraceContextRecord.cs
- OleDbRowUpdatingEvent.cs
- EncodingNLS.cs
- CodeTypeConstructor.cs
- SmiTypedGetterSetter.cs
- ProfileServiceManager.cs
- MatrixKeyFrameCollection.cs
- DocumentViewerBaseAutomationPeer.cs
- SqlInternalConnection.cs
- ChangePassword.cs
- ScrollProviderWrapper.cs
- GetReadStreamResult.cs
- __TransparentProxy.cs
- ProjectionQueryOptionExpression.cs
- ChangeBlockUndoRecord.cs
- FolderLevelBuildProviderCollection.cs
- InvokeProviderWrapper.cs
- CompiledXpathExpr.cs
- SafeCryptHandles.cs
- ExceptionNotification.cs
- WmlObjectListAdapter.cs
- Pts.cs
- MarkupExtensionParser.cs