Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlMethodTransformer.cs / 1305376 / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FlowDocumentScrollViewer.cs
- StackBuilderSink.cs
- WorkItem.cs
- NullReferenceException.cs
- IssuedTokenServiceElement.cs
- BooleanProjectedSlot.cs
- LogConverter.cs
- GridEntryCollection.cs
- SQLInt64.cs
- TemplateKeyConverter.cs
- ListViewItem.cs
- BinarySerializer.cs
- HandledEventArgs.cs
- HMACMD5.cs
- CurrentChangingEventArgs.cs
- EventNotify.cs
- OleServicesContext.cs
- HandledEventArgs.cs
- MetadataSource.cs
- AssemblyInfo.cs
- WindowsToolbarAsMenu.cs
- ScrollProperties.cs
- GACIdentityPermission.cs
- XmlDocument.cs
- SoapParser.cs
- TreeNodeStyle.cs
- QuadraticBezierSegment.cs
- DataBoundControl.cs
- ToggleButton.cs
- WpfMemberInvoker.cs
- DataViewListener.cs
- SplayTreeNode.cs
- UshortList2.cs
- ApplicationFileCodeDomTreeGenerator.cs
- TrackBarDesigner.cs
- PanelDesigner.cs
- ComboBox.cs
- ProgressiveCrcCalculatingStream.cs
- DataGridViewComponentPropertyGridSite.cs
- WindowCollection.cs
- SqlReorderer.cs
- HeaderLabel.cs
- TreeNode.cs
- InternalResources.cs
- BufferBuilder.cs
- HttpFileCollection.cs
- AuthenticationConfig.cs
- TextAction.cs
- DockingAttribute.cs
- IDispatchConstantAttribute.cs
- DataServiceException.cs
- ExceptionHandlersDesigner.cs
- MethodBuilderInstantiation.cs
- SystemNetworkInterface.cs
- SqlServer2KCompatibilityAnnotation.cs
- HandleExceptionArgs.cs
- SpellCheck.cs
- GacUtil.cs
- Cursor.cs
- MatrixTransform3D.cs
- LineMetrics.cs
- InlineObject.cs
- ProcessRequestArgs.cs
- PermissionRequestEvidence.cs
- StringInfo.cs
- PublishLicense.cs
- ComponentRenameEvent.cs
- WindowsRichEdit.cs
- TargetControlTypeCache.cs
- IDictionary.cs
- Drawing.cs
- DataKey.cs
- ToolStripDropDownItemDesigner.cs
- HttpListenerException.cs
- BinaryObjectInfo.cs
- Viewport2DVisual3D.cs
- ManipulationLogic.cs
- TableLayoutPanel.cs
- XmlDataSourceView.cs
- QuerySettings.cs
- ReceiveSecurityHeader.cs
- RangeContentEnumerator.cs
- WebBrowserProgressChangedEventHandler.cs
- XmlIlGenerator.cs
- ToolStripPanelCell.cs
- GeneralTransform3DTo2D.cs
- UrlPropertyAttribute.cs
- DynamicMethod.cs
- ValueExpressions.cs
- HitTestParameters.cs
- PassportAuthenticationModule.cs
- XmlNavigatorStack.cs
- AutoGeneratedFieldProperties.cs
- QilXmlReader.cs
- StyleTypedPropertyAttribute.cs
- PackagePart.cs
- OdbcParameter.cs
- SamlDoNotCacheCondition.cs
- CatalogZone.cs
- ActivityLocationReferenceEnvironment.cs