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
- FamilyTypefaceCollection.cs
- TimeSpanSecondsOrInfiniteConverter.cs
- SafeSecurityHelper.cs
- SizeFConverter.cs
- StringWriter.cs
- EncryptedKey.cs
- XPathArrayIterator.cs
- WebPartMenu.cs
- BindableTemplateBuilder.cs
- TextFormatterContext.cs
- ContainerActivationHelper.cs
- CurrentChangingEventManager.cs
- SerializerWriterEventHandlers.cs
- InitializerFacet.cs
- ContentType.cs
- StylusEditingBehavior.cs
- ChangePasswordAutoFormat.cs
- ArcSegment.cs
- EnvelopedSignatureTransform.cs
- COM2PropertyPageUITypeConverter.cs
- TraceListeners.cs
- FaultDescription.cs
- XmlMtomWriter.cs
- _ListenerAsyncResult.cs
- EventEntry.cs
- ISessionStateStore.cs
- EntityContainerRelationshipSet.cs
- NameTable.cs
- StringBlob.cs
- NonParentingControl.cs
- TraceContext.cs
- rsa.cs
- TickBar.cs
- ScriptResourceDefinition.cs
- KeyedCollection.cs
- EntitySetBase.cs
- ISSmlParser.cs
- InheritanceUI.cs
- PartBasedPackageProperties.cs
- wmiprovider.cs
- ListViewGroupConverter.cs
- DrawingCollection.cs
- FixedSOMTableRow.cs
- PathSegmentCollection.cs
- SegmentInfo.cs
- FontStyle.cs
- UnicodeEncoding.cs
- ClrProviderManifest.cs
- ApplyTemplatesAction.cs
- LightweightCodeGenerator.cs
- SQLMembershipProvider.cs
- MatrixStack.cs
- CheckBoxField.cs
- RTTypeWrapper.cs
- GZipDecoder.cs
- CheckBoxList.cs
- TokenBasedSetEnumerator.cs
- ToolBarButtonDesigner.cs
- DockAndAnchorLayout.cs
- FamilyTypeface.cs
- QualificationDataItem.cs
- SqlError.cs
- ManualResetEvent.cs
- StrokeRenderer.cs
- RequestStatusBarUpdateEventArgs.cs
- ReadOnlyTernaryTree.cs
- FileEnumerator.cs
- SplitterCancelEvent.cs
- StringSorter.cs
- ECDiffieHellmanCng.cs
- WindowsAuthenticationEventArgs.cs
- LoginUtil.cs
- Update.cs
- DataTableReaderListener.cs
- BitmapPalette.cs
- TypefaceMap.cs
- CharAnimationBase.cs
- NodeFunctions.cs
- ListBox.cs
- ColumnResizeAdorner.cs
- QuaternionRotation3D.cs
- BuiltInPermissionSets.cs
- WeakReference.cs
- AuthenticateEventArgs.cs
- DrawListViewColumnHeaderEventArgs.cs
- TextRunTypographyProperties.cs
- SelectionGlyphBase.cs
- JavaScriptString.cs
- IxmlLineInfo.cs
- AssociationSetEnd.cs
- SymmetricSecurityProtocolFactory.cs
- SqlError.cs
- HideDisabledControlAdapter.cs
- TagMapInfo.cs
- QueryTaskGroupState.cs
- DataGridToolTip.cs
- ConnectionManagementElementCollection.cs
- Context.cs
- TabItemWrapperAutomationPeer.cs
- SafeSecurityHelper.cs