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
![Network programming in C#, Network Programming in VB.NET, Network Programming in .NET](/images/book.jpg)
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- NameValueCollection.cs
- ColorConverter.cs
- CodePropertyReferenceExpression.cs
- PDBReader.cs
- IisTraceWebEventProvider.cs
- CodeMemberMethod.cs
- SyndicationDeserializer.cs
- EdgeProfileValidation.cs
- FlowDocumentReader.cs
- BookmarkResumptionRecord.cs
- DataGridViewControlCollection.cs
- ParentQuery.cs
- OrderingQueryOperator.cs
- SessionPageStatePersister.cs
- OleDbEnumerator.cs
- GridToolTip.cs
- ZoneButton.cs
- BuiltInPermissionSets.cs
- ListViewItem.cs
- EdmMember.cs
- AlignmentYValidation.cs
- VirtualizingPanel.cs
- IISUnsafeMethods.cs
- IFlowDocumentViewer.cs
- IndexOutOfRangeException.cs
- BitStream.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- DataSourceXmlSerializationAttribute.cs
- TriState.cs
- HiddenField.cs
- TemplateContentLoader.cs
- ElementProxy.cs
- MemoryMappedViewStream.cs
- SecurityTokenSerializer.cs
- TextTreeUndoUnit.cs
- XmlSchemaComplexContent.cs
- XamlGridLengthSerializer.cs
- HttpVersion.cs
- ScriptResourceDefinition.cs
- FixedStringLookup.cs
- SafeNativeMethodsCLR.cs
- SpanIndex.cs
- XmlnsDefinitionAttribute.cs
- WasAdminWrapper.cs
- TemplateKey.cs
- FocusTracker.cs
- Cursor.cs
- DocumentApplicationJournalEntry.cs
- ParseElementCollection.cs
- CustomLineCap.cs
- COM2IVsPerPropertyBrowsingHandler.cs
- DataRowComparer.cs
- TemplateField.cs
- FileDialog_Vista.cs
- ContentTypeSettingDispatchMessageFormatter.cs
- RuleProcessor.cs
- XmlReader.cs
- SqlBooleanMismatchVisitor.cs
- ListItemViewControl.cs
- SafeArrayRankMismatchException.cs
- OperationValidationEventArgs.cs
- AssemblyBuilder.cs
- DocumentViewerBaseAutomationPeer.cs
- WorkflowApplication.cs
- BasicHttpMessageSecurity.cs
- HwndStylusInputProvider.cs
- FieldAccessException.cs
- SafeTokenHandle.cs
- HostProtectionPermission.cs
- ApplicationServiceManager.cs
- CompensatableSequenceActivity.cs
- ADMembershipUser.cs
- BufferModesCollection.cs
- ToolStripContentPanel.cs
- ConfigXmlElement.cs
- WorkflowServiceHostFactory.cs
- _OSSOCK.cs
- IERequestCache.cs
- ToolStripPanelRenderEventArgs.cs
- CryptoProvider.cs
- ArgIterator.cs
- BackStopAuthenticationModule.cs
- DataGridCommandEventArgs.cs
- BaseCAMarshaler.cs
- DiscoveryMessageSequenceCD1.cs
- CharEnumerator.cs
- Int16Converter.cs
- ListDataHelper.cs
- TimeoutHelper.cs
- DataColumnSelectionConverter.cs
- PopupEventArgs.cs
- MouseOverProperty.cs
- RulePatternOps.cs
- NCryptNative.cs
- MarshalDirectiveException.cs
- SoapObjectWriter.cs
- DuplexClientBase.cs
- Buffer.cs
- HintTextConverter.cs
- RenderTargetBitmap.cs