Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlMethodTransformer.cs / 2 / 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
- TextWriterTraceListener.cs
- DependencyPropertyKey.cs
- DefaultBinder.cs
- GroupAggregateExpr.cs
- NameValueFileSectionHandler.cs
- ContractReference.cs
- BooleanFunctions.cs
- TextTreeText.cs
- GeometryGroup.cs
- UserControlAutomationPeer.cs
- WinEventWrap.cs
- WebPartMovingEventArgs.cs
- SqlIdentifier.cs
- OletxVolatileEnlistment.cs
- PublisherMembershipCondition.cs
- HttpServerVarsCollection.cs
- CellTreeNode.cs
- OpenTypeLayout.cs
- DefaultExpressionVisitor.cs
- CoreSwitches.cs
- SchemaSetCompiler.cs
- SafeProcessHandle.cs
- EntityDataSourceContextCreatingEventArgs.cs
- FileNotFoundException.cs
- DesignColumn.cs
- designeractionlistschangedeventargs.cs
- CacheModeConverter.cs
- SQLDecimal.cs
- DataGridViewRowsAddedEventArgs.cs
- HiddenField.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- Compiler.cs
- StyleBamlRecordReader.cs
- MenuItemStyleCollection.cs
- ToolStripArrowRenderEventArgs.cs
- DataSourceSerializationException.cs
- ThreadStartException.cs
- OutArgumentConverter.cs
- GetCardDetailsRequest.cs
- AbandonedMutexException.cs
- DbProviderFactory.cs
- ListViewItem.cs
- CodeTypeReferenceCollection.cs
- RadioButton.cs
- XmlSchemaExternal.cs
- ConversionContext.cs
- DependsOnAttribute.cs
- MethodBuilder.cs
- VarRemapper.cs
- FocusManager.cs
- BufferedWebEventProvider.cs
- Soap.cs
- DynamicQueryableWrapper.cs
- Point.cs
- ActivityMarkupSerializationProvider.cs
- VarRefManager.cs
- LogRestartAreaEnumerator.cs
- ClientSettingsSection.cs
- precedingquery.cs
- ComponentResourceKey.cs
- BinaryFormatter.cs
- RenderContext.cs
- ValueUtilsSmi.cs
- StylusCaptureWithinProperty.cs
- WindowsScroll.cs
- ServiceObjectContainer.cs
- Lock.cs
- CheckBoxField.cs
- CompressStream.cs
- StylusPlugin.cs
- AnimationClockResource.cs
- DecoderFallback.cs
- VersionedStreamOwner.cs
- XmlUrlEditor.cs
- CompositeFontFamily.cs
- GetCryptoTransformRequest.cs
- WebPartHeaderCloseVerb.cs
- XmlDataSourceNodeDescriptor.cs
- PrimitiveList.cs
- SimpleTypeResolver.cs
- XmlSerializerAssemblyAttribute.cs
- EditorServiceContext.cs
- ItemMap.cs
- PaperSource.cs
- CancelEventArgs.cs
- InputLanguageCollection.cs
- TagNameToTypeMapper.cs
- DiagnosticTrace.cs
- IPAddressCollection.cs
- WebHeaderCollection.cs
- WarningException.cs
- SqlXml.cs
- HwndTarget.cs
- MasterPage.cs
- EntityParameterCollection.cs
- HttpWebResponse.cs
- DSASignatureDeformatter.cs
- WizardPanel.cs
- MergeLocalizationDirectives.cs
- TypeNameHelper.cs