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
- LogRestartAreaEnumerator.cs
- TemplatedMailWebEventProvider.cs
- DataSourceView.cs
- TreeSet.cs
- EventSetterHandlerConverter.cs
- CompressionTransform.cs
- XPathSingletonIterator.cs
- GCHandleCookieTable.cs
- BridgeDataRecord.cs
- TargetException.cs
- unitconverter.cs
- DetailsViewDeleteEventArgs.cs
- ListBoxItem.cs
- StructuredTypeInfo.cs
- NamedPipeConnectionPool.cs
- ErrorWrapper.cs
- RequestNavigateEventArgs.cs
- TextAutomationPeer.cs
- FrameworkContextData.cs
- PolicyVersionConverter.cs
- ISFClipboardData.cs
- TransactionScope.cs
- ProfileBuildProvider.cs
- DelegateArgumentReference.cs
- Type.cs
- DataGridViewColumnCollection.cs
- ActivityExecutorDelegateInfo.cs
- TagPrefixInfo.cs
- RTLAwareMessageBox.cs
- DataGridColumnCollection.cs
- CodeDirectiveCollection.cs
- ObjectKeyFrameCollection.cs
- odbcmetadatacollectionnames.cs
- AvtEvent.cs
- RenderDataDrawingContext.cs
- DesignerActionList.cs
- AutoGeneratedField.cs
- __ComObject.cs
- ClickablePoint.cs
- DecimalAnimation.cs
- WebPartMinimizeVerb.cs
- FontStretchConverter.cs
- PointKeyFrameCollection.cs
- SecurityTokenProvider.cs
- XsltContext.cs
- Journaling.cs
- ReferenceAssemblyAttribute.cs
- TextElementCollectionHelper.cs
- Type.cs
- FunctionDetailsReader.cs
- ContextMenuStrip.cs
- ErrorWebPart.cs
- StorageAssociationTypeMapping.cs
- IISUnsafeMethods.cs
- ExcCanonicalXml.cs
- PeerSecurityManager.cs
- XmlAttributeHolder.cs
- DirectoryObjectSecurity.cs
- EmptyStringExpandableObjectConverter.cs
- PolicyLevel.cs
- UnicastIPAddressInformationCollection.cs
- SqlDataSourceCommandEventArgs.cs
- StrongTypingException.cs
- TreeViewCancelEvent.cs
- Int32Rect.cs
- AppLevelCompilationSectionCache.cs
- SubpageParaClient.cs
- SelectionEditor.cs
- ToolStripItem.cs
- XmlAttributeCollection.cs
- ResourceDictionary.cs
- ObjectViewFactory.cs
- XmlSchemaAppInfo.cs
- ListItemDetailViewAttribute.cs
- FormsAuthenticationUser.cs
- SecurityChannelFaultConverter.cs
- BuildManager.cs
- StringUtil.cs
- PointAnimationUsingPath.cs
- OleDbPropertySetGuid.cs
- TrustLevelCollection.cs
- AuthorizationRuleCollection.cs
- _Rfc2616CacheValidators.cs
- SQLRoleProvider.cs
- FragmentQueryKB.cs
- Privilege.cs
- BitmapEffectState.cs
- FormParameter.cs
- ClosableStream.cs
- EntryIndex.cs
- DataViewListener.cs
- Util.cs
- KeyedHashAlgorithm.cs
- DrawingGroup.cs
- SpecialNameAttribute.cs
- ContextMenuStripActionList.cs
- ExceptionAggregator.cs
- JobInputBins.cs
- DefaultMemberAttribute.cs
- VerticalConnector.xaml.cs