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
- HtmlElementCollection.cs
- XmlNamedNodeMap.cs
- BitmapEffectOutputConnector.cs
- ModifiableIteratorCollection.cs
- PackageDigitalSignature.cs
- WinEventHandler.cs
- FamilyMap.cs
- PointLight.cs
- AutomationFocusChangedEventArgs.cs
- StrongName.cs
- invalidudtexception.cs
- DataGridItemEventArgs.cs
- SQLInt32.cs
- SourceFilter.cs
- SendMailErrorEventArgs.cs
- TextRunCacheImp.cs
- TextServicesCompartment.cs
- SqlBooleanizer.cs
- LazyTextWriterCreator.cs
- BitmapSizeOptions.cs
- SaveFileDialog.cs
- Point.cs
- Size3DValueSerializer.cs
- PropertyFilter.cs
- InputScopeNameConverter.cs
- TimeoutConverter.cs
- ProgressBar.cs
- PipelineModuleStepContainer.cs
- Point.cs
- RangeValidator.cs
- TcpSocketManager.cs
- LayoutExceptionEventArgs.cs
- DataGridViewAdvancedBorderStyle.cs
- TraceListeners.cs
- Pkcs9Attribute.cs
- XsltCompileContext.cs
- BaseCollection.cs
- EmptyEnumerable.cs
- FileDetails.cs
- SoundPlayerAction.cs
- OleDbStruct.cs
- SmtpReplyReaderFactory.cs
- StorageTypeMapping.cs
- FlowDocumentScrollViewer.cs
- DataServiceClientException.cs
- TableLayoutPanel.cs
- DataExpression.cs
- NumberFunctions.cs
- CompilerHelpers.cs
- FileChangesMonitor.cs
- Event.cs
- DecoderNLS.cs
- XmlSchemaElement.cs
- CompiledIdentityConstraint.cs
- CharacterBuffer.cs
- MouseActionConverter.cs
- DataErrorValidationRule.cs
- FieldBuilder.cs
- SamlAttributeStatement.cs
- NotifyInputEventArgs.cs
- _AcceptOverlappedAsyncResult.cs
- RichTextBoxAutomationPeer.cs
- CodeSnippetTypeMember.cs
- CollectionType.cs
- EtwTrace.cs
- OrderedDictionary.cs
- ParameterModifier.cs
- Msmq4SubqueuePoisonHandler.cs
- safelink.cs
- ResourceExpression.cs
- TextTreeNode.cs
- HttpHeaderCollection.cs
- SolidColorBrush.cs
- XPathPatternBuilder.cs
- Exceptions.cs
- EnlistmentTraceIdentifier.cs
- ToolStripTextBox.cs
- DescendantBaseQuery.cs
- SwitchElementsCollection.cs
- InstanceLockLostException.cs
- ReceiveParametersContent.cs
- HtmlTextArea.cs
- ManifestResourceInfo.cs
- MasterPage.cs
- DeliveryStrategy.cs
- StrongNameMembershipCondition.cs
- TickBar.cs
- COAUTHINFO.cs
- FacetEnabledSchemaElement.cs
- DataFieldCollectionEditor.cs
- SqlServices.cs
- DefaultCommandConverter.cs
- ProvidersHelper.cs
- MemberPath.cs
- ReadOnlyDictionary.cs
- SmtpNegotiateAuthenticationModule.cs
- ErrorBehavior.cs
- VirtualPath.cs
- RootDesignerSerializerAttribute.cs
- DllNotFoundException.cs