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
- RegexMatchCollection.cs
- AVElementHelper.cs
- CatalogPartChrome.cs
- wmiprovider.cs
- ColorAnimationUsingKeyFrames.cs
- XmlNodeComparer.cs
- MenuItemBinding.cs
- StorageRoot.cs
- ChangeToolStripParentVerb.cs
- Size3DValueSerializer.cs
- BindingList.cs
- Stroke.cs
- AbstractExpressions.cs
- OracleRowUpdatedEventArgs.cs
- ScalarType.cs
- CreateUserWizard.cs
- Itemizer.cs
- Stream.cs
- DataControlFieldCell.cs
- TextTreeObjectNode.cs
- PrtCap_Public.cs
- SemaphoreSecurity.cs
- _RequestCacheProtocol.cs
- RadioButtonAutomationPeer.cs
- BindValidator.cs
- DocumentReference.cs
- AttachedProperty.cs
- ServiceModelConfigurationSectionCollection.cs
- MasterPage.cs
- WorkflowRuntimeSection.cs
- Win32MouseDevice.cs
- CursorConverter.cs
- PropertyConverter.cs
- TreeNodeBindingCollection.cs
- ContextMenuAutomationPeer.cs
- Path.cs
- IssuedTokenParametersEndpointAddressElement.cs
- TextFormattingConverter.cs
- SoapDocumentMethodAttribute.cs
- ControlLocalizer.cs
- IChannel.cs
- ChangeProcessor.cs
- InstanceOwnerQueryResult.cs
- DisableDpiAwarenessAttribute.cs
- EventWaitHandleSecurity.cs
- TextEditorLists.cs
- WebPartsSection.cs
- handlecollector.cs
- ThaiBuddhistCalendar.cs
- DiscreteKeyFrames.cs
- RuntimeVariableList.cs
- PrimitiveSchema.cs
- MetaTableHelper.cs
- UnmanagedMemoryStream.cs
- TreeView.cs
- PasswordDeriveBytes.cs
- ExpandoClass.cs
- Identifier.cs
- BinaryMethodMessage.cs
- Win32MouseDevice.cs
- HttpFileCollectionBase.cs
- FtpWebResponse.cs
- DatagridviewDisplayedBandsData.cs
- LocatorGroup.cs
- RtfToken.cs
- DataSet.cs
- ChildrenQuery.cs
- UncommonField.cs
- ProcessThread.cs
- MessagingDescriptionAttribute.cs
- Menu.cs
- MembershipValidatePasswordEventArgs.cs
- GlobalizationAssembly.cs
- oledbmetadatacollectionnames.cs
- serverconfig.cs
- QueryReaderSettings.cs
- FrugalList.cs
- PreviewPrintController.cs
- LinqDataSourceDeleteEventArgs.cs
- ImageListStreamer.cs
- SetterBaseCollection.cs
- XhtmlBasicCalendarAdapter.cs
- GestureRecognizer.cs
- ETagAttribute.cs
- OSFeature.cs
- FastEncoderWindow.cs
- AsyncResult.cs
- SHA384.cs
- ColumnWidthChangedEvent.cs
- PrintPreviewControl.cs
- HtmlEncodedRawTextWriter.cs
- EntityDataSourceDesigner.cs
- RawKeyboardInputReport.cs
- SortedDictionary.cs
- hresults.cs
- MemberAccessException.cs
- Condition.cs
- SelectorAutomationPeer.cs
- MinimizableAttributeTypeConverter.cs
- XsltSettings.cs