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
- AspProxy.cs
- Helpers.cs
- PageWrapper.cs
- NavigationCommands.cs
- CheckBoxFlatAdapter.cs
- SrgsRuleRef.cs
- CheckBoxStandardAdapter.cs
- OleDbEnumerator.cs
- BrowserCapabilitiesFactory35.cs
- _SingleItemRequestCache.cs
- TextServicesPropertyRanges.cs
- ChangeDirector.cs
- NullNotAllowedCollection.cs
- NavigationProperty.cs
- ContextMarshalException.cs
- RemotingSurrogateSelector.cs
- GeneralTransform3DTo2D.cs
- XsdCachingReader.cs
- ScrollProviderWrapper.cs
- RemotingSurrogateSelector.cs
- SharingService.cs
- DataError.cs
- CellPartitioner.cs
- GacUtil.cs
- RequestCacheEntry.cs
- WindowsContainer.cs
- XmlRootAttribute.cs
- ToolboxItemFilterAttribute.cs
- PictureBox.cs
- FacetDescription.cs
- DriveNotFoundException.cs
- GridViewSortEventArgs.cs
- JournalEntryStack.cs
- SignerInfo.cs
- ListViewDeleteEventArgs.cs
- sqlinternaltransaction.cs
- ToolStripDropTargetManager.cs
- PageTheme.cs
- Model3DGroup.cs
- ManipulationDeltaEventArgs.cs
- SecurityChannelFaultConverter.cs
- SuppressMergeCheckAttribute.cs
- Point.cs
- AxHost.cs
- MessageBox.cs
- LicenseException.cs
- OutputCacheModule.cs
- ScaleTransform.cs
- SchemaImporterExtension.cs
- HttpStreamXmlDictionaryWriter.cs
- ApplicationSecurityInfo.cs
- TreeViewItemAutomationPeer.cs
- Wildcard.cs
- ParallelTimeline.cs
- SystemFonts.cs
- TrustLevel.cs
- PathFigureCollection.cs
- ADConnectionHelper.cs
- MD5CryptoServiceProvider.cs
- ReachDocumentSequenceSerializer.cs
- IPCCacheManager.cs
- TargetParameterCountException.cs
- EntitySetBase.cs
- HttpCachePolicy.cs
- HtmlInputControl.cs
- SafeNativeMethodsOther.cs
- VBIdentifierName.cs
- DataGridViewAutoSizeModeEventArgs.cs
- ActivityExecutionFilter.cs
- ExeContext.cs
- XmlValidatingReaderImpl.cs
- ButtonFlatAdapter.cs
- ImageClickEventArgs.cs
- IconBitmapDecoder.cs
- ThicknessKeyFrameCollection.cs
- UntypedNullExpression.cs
- HtmlForm.cs
- DebugHandleTracker.cs
- UdpTransportSettings.cs
- WindowPattern.cs
- Utils.cs
- DesignerSerializationVisibilityAttribute.cs
- BuildProviderUtils.cs
- MobileDeviceCapabilitiesSectionHandler.cs
- Header.cs
- AuthenticationService.cs
- DataGridCellEditEndingEventArgs.cs
- CloseSequenceResponse.cs
- NativeMethodsCLR.cs
- WorkerProcess.cs
- OptimizedTemplateContent.cs
- DataGridViewRowErrorTextNeededEventArgs.cs
- DiscoveryServerProtocol.cs
- NativeMethods.cs
- ThreadSafeList.cs
- ComponentCommands.cs
- ContainerParagraph.cs
- WindowsRebar.cs
- Control.cs
- RunClient.cs