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
- UnaryOperationBinder.cs
- EdmError.cs
- RelationshipDetailsCollection.cs
- BitmapEffectInput.cs
- LinkAreaEditor.cs
- ProfilePropertyMetadata.cs
- StrictAndMessageFilter.cs
- UInt16.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- AdRotator.cs
- UserControlBuildProvider.cs
- SqlConnectionFactory.cs
- EventSetter.cs
- AvTraceDetails.cs
- DBDataPermissionAttribute.cs
- WorkflowPrinting.cs
- PinnedBufferMemoryStream.cs
- WindowsUpDown.cs
- BigInt.cs
- TypeDescriptionProviderAttribute.cs
- COM2FontConverter.cs
- VirtualPath.cs
- ExternalException.cs
- XhtmlTextWriter.cs
- ValidatorCompatibilityHelper.cs
- CharKeyFrameCollection.cs
- XmlWriter.cs
- Label.cs
- _SslSessionsCache.cs
- AsmxEndpointPickerExtension.cs
- ObjectDesignerDataSourceView.cs
- WebPartConnectionsCancelVerb.cs
- ThreadPool.cs
- CmsInterop.cs
- CustomActivityDesigner.cs
- HyperLink.cs
- RootBrowserWindowProxy.cs
- StatusBar.cs
- SqlUserDefinedAggregateAttribute.cs
- PieceNameHelper.cs
- PropertyDescriptorComparer.cs
- DocumentOrderComparer.cs
- SqlNotificationRequest.cs
- MenuAutomationPeer.cs
- DependentList.cs
- PersistenceTypeAttribute.cs
- TemplatedWizardStep.cs
- ChannelServices.cs
- FamilyTypefaceCollection.cs
- SqlRowUpdatingEvent.cs
- XmlUrlResolver.cs
- XsltContext.cs
- SiteMapDataSourceDesigner.cs
- CalendarSelectionChangedEventArgs.cs
- VectorCollection.cs
- DataListItemEventArgs.cs
- CheckBoxList.cs
- ResourceExpression.cs
- DataGridItemEventArgs.cs
- ContentValidator.cs
- DataPager.cs
- MsmqIntegrationSecurityMode.cs
- Int32RectConverter.cs
- UInt16Converter.cs
- WebScriptMetadataMessageEncoderFactory.cs
- PreDigestedSignedInfo.cs
- TdsParser.cs
- BufferAllocator.cs
- HttpWebResponse.cs
- DataGridCellsPresenter.cs
- DataKeyArray.cs
- UnsafeNativeMethods.cs
- ObjectDataSourceDesigner.cs
- ImageIndexConverter.cs
- InkCanvasFeedbackAdorner.cs
- PerfCounters.cs
- Compensation.cs
- ArgumentNullException.cs
- InplaceBitmapMetadataWriter.cs
- StoragePropertyMapping.cs
- QilXmlWriter.cs
- CodeCompiler.cs
- EpmContentSerializer.cs
- ExtensionFile.cs
- CodeStatement.cs
- OrderedEnumerableRowCollection.cs
- Privilege.cs
- updatecommandorderer.cs
- RowTypePropertyElement.cs
- COM2FontConverter.cs
- XmlSyndicationContent.cs
- TypeHelper.cs
- BatchStream.cs
- QilStrConcat.cs
- OleDbConnectionInternal.cs
- UnionExpr.cs
- PropertyEntry.cs
- Attributes.cs
- SmtpFailedRecipientException.cs
- BaseHashHelper.cs