Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlMethodTransformer.cs / 1 / 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
- Clipboard.cs
- FtpWebResponse.cs
- QueryPageSettingsEventArgs.cs
- DataKey.cs
- ValidationErrorEventArgs.cs
- RowCache.cs
- HtmlInputButton.cs
- SafeNativeMethods.cs
- FrameworkContentElement.cs
- SessionPageStatePersister.cs
- MimeTypeAttribute.cs
- CollectionChangeEventArgs.cs
- InstancePersistenceException.cs
- MenuItemAutomationPeer.cs
- VersionPair.cs
- XDeferredAxisSource.cs
- HttpCapabilitiesBase.cs
- MetadataItemEmitter.cs
- EntityDataSourceSelectingEventArgs.cs
- APCustomTypeDescriptor.cs
- TextLineBreak.cs
- WebControlsSection.cs
- ClientProxyGenerator.cs
- EntityTypeEmitter.cs
- Button.cs
- WebPartConnectionsCloseVerb.cs
- EventMappingSettingsCollection.cs
- DataGridViewRowPostPaintEventArgs.cs
- XmlSchemaAttributeGroup.cs
- PropertyAccessVisitor.cs
- ProjectionQueryOptionExpression.cs
- SqlUserDefinedTypeAttribute.cs
- DBNull.cs
- InfoCardRSAOAEPKeyExchangeDeformatter.cs
- ScalarConstant.cs
- RoutedEvent.cs
- XamlTemplateSerializer.cs
- PatternMatcher.cs
- DataColumnMappingCollection.cs
- GenerateScriptTypeAttribute.cs
- SolidColorBrush.cs
- TextTreeObjectNode.cs
- ReadingWritingEntityEventArgs.cs
- SqlDataReaderSmi.cs
- UseLicense.cs
- Decimal.cs
- InfocardExtendedInformationCollection.cs
- TabControlAutomationPeer.cs
- Bold.cs
- TextPointerBase.cs
- TableLayoutPanelCellPosition.cs
- ModelServiceImpl.cs
- MouseDevice.cs
- DataPagerFieldItem.cs
- TableCell.cs
- NotifyIcon.cs
- ConstNode.cs
- MailBnfHelper.cs
- BitmapCodecInfoInternal.cs
- hwndwrapper.cs
- HwndHost.cs
- Geometry3D.cs
- SrgsSubset.cs
- PropertyToken.cs
- ScriptControl.cs
- OutputCacheEntry.cs
- SelfSignedCertificate.cs
- FormsAuthentication.cs
- ResourcesChangeInfo.cs
- SafeNativeMethods.cs
- CaseInsensitiveHashCodeProvider.cs
- ByteStreamMessageEncodingElement.cs
- BitmapFrame.cs
- HostedController.cs
- HttpHandlersSection.cs
- SplitterCancelEvent.cs
- ClientUtils.cs
- AnnotationComponentChooser.cs
- ParamArrayAttribute.cs
- BitmapMetadataEnumerator.cs
- PersistenceTypeAttribute.cs
- OdbcConnectionString.cs
- CompensateDesigner.cs
- WorkflowTraceTransfer.cs
- ChainOfResponsibility.cs
- SerializableAttribute.cs
- COM2EnumConverter.cs
- DeclaredTypeElement.cs
- SplitterEvent.cs
- HttpBrowserCapabilitiesBase.cs
- ByeMessageCD1.cs
- SafeFindHandle.cs
- RequiredFieldValidator.cs
- EmptyWithCancelationCheckWorkItem.cs
- StateWorkerRequest.cs
- InternalResources.cs
- Transactions.cs
- OleDbParameterCollection.cs
- ElementInit.cs
- PolicyImporterElementCollection.cs