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
- ByteAnimationUsingKeyFrames.cs
- MsmqIntegrationAppDomainProtocolHandler.cs
- RequestResponse.cs
- OutputCacheModule.cs
- UnmanagedMemoryStream.cs
- DbMetaDataColumnNames.cs
- DynamicResourceExtension.cs
- objectresult_tresulttype.cs
- SQLMoney.cs
- BatchParser.cs
- ParameterCollection.cs
- KeyInstance.cs
- StrokeNodeEnumerator.cs
- TableCell.cs
- XPathArrayIterator.cs
- RelationshipFixer.cs
- Variant.cs
- JsonReaderWriterFactory.cs
- PropertyConverter.cs
- StructuredTypeInfo.cs
- TaskFormBase.cs
- DataGridViewRowPrePaintEventArgs.cs
- FrameworkContentElement.cs
- DirtyTextRange.cs
- DataContractFormatAttribute.cs
- SoapSchemaMember.cs
- XmlSchemaSimpleTypeRestriction.cs
- ThreadAbortException.cs
- DataObjectPastingEventArgs.cs
- ProxyWebPart.cs
- TabItem.cs
- PersonalizationProviderHelper.cs
- Vertex.cs
- CharacterShapingProperties.cs
- SafeFileHandle.cs
- PnrpPeerResolverElement.cs
- QilGeneratorEnv.cs
- DataSourceCacheDurationConverter.cs
- DeflateEmulationStream.cs
- EntityDataSource.cs
- TreeIterators.cs
- TreeWalker.cs
- HttpWebRequestElement.cs
- HtmlForm.cs
- ArgumentException.cs
- mansign.cs
- DataColumnMapping.cs
- DefaultValueTypeConverter.cs
- SecurityManager.cs
- GenericWebPart.cs
- RequestCacheEntry.cs
- GeometryValueSerializer.cs
- RestHandlerFactory.cs
- StoragePropertyMapping.cs
- DataGridViewAccessibleObject.cs
- DataTableExtensions.cs
- TextControl.cs
- CompilerInfo.cs
- DateTimeOffset.cs
- CacheMemory.cs
- ObjectListComponentEditor.cs
- APCustomTypeDescriptor.cs
- XPathException.cs
- HttpWebRequestElement.cs
- CriticalFileToken.cs
- PageVisual.cs
- HtmlShim.cs
- EntityDataSourceWrapper.cs
- StubHelpers.cs
- ConnectionInterfaceCollection.cs
- SqlErrorCollection.cs
- ISSmlParser.cs
- Matrix3D.cs
- HtmlLinkAdapter.cs
- SupportingTokenSpecification.cs
- XmlSchemaSimpleType.cs
- CompiledQuery.cs
- _NtlmClient.cs
- QueryContinueDragEvent.cs
- DeadLetterQueue.cs
- OpenTypeCommon.cs
- SqlTypesSchemaImporter.cs
- QilFactory.cs
- ToolStripPanelRenderEventArgs.cs
- VariableDesigner.xaml.cs
- SoapSchemaImporter.cs
- FixedSOMLineCollection.cs
- RuleSetDialog.Designer.cs
- TypeSemantics.cs
- TypeNameConverter.cs
- RequestCachePolicyConverter.cs
- Stream.cs
- StringSource.cs
- WpfKnownMember.cs
- DockingAttribute.cs
- DefaultValueTypeConverter.cs
- SignatureToken.cs
- WebBodyFormatMessageProperty.cs
- RequestTimeoutManager.cs
- DataListCommandEventArgs.cs