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
- TabControlAutomationPeer.cs
- TemplatePropertyEntry.cs
- StyleHelper.cs
- DescendentsWalker.cs
- ConfigurationStrings.cs
- EntitySetDataBindingList.cs
- ToolStripItemGlyph.cs
- SessionStateItemCollection.cs
- ResourceDisplayNameAttribute.cs
- MonitorWrapper.cs
- XmlSchemaAnnotation.cs
- XmlDigitalSignatureProcessor.cs
- sitestring.cs
- MeshGeometry3D.cs
- EntityWithChangeTrackerStrategy.cs
- RelatedView.cs
- ByteKeyFrameCollection.cs
- TemplatedAdorner.cs
- SystemIPv6InterfaceProperties.cs
- ErrorFormatterPage.cs
- StreamGeometry.cs
- LinqDataSourceUpdateEventArgs.cs
- Int64.cs
- WebPartVerbCollection.cs
- XPathChildIterator.cs
- EnumerableWrapperWeakToStrong.cs
- AttachedPropertyDescriptor.cs
- DocumentXmlWriter.cs
- ScrollChrome.cs
- StateWorkerRequest.cs
- DataGridViewColumn.cs
- XmlExpressionDumper.cs
- QueryResponse.cs
- RuntimeConfigurationRecord.cs
- HttpListenerResponse.cs
- DateTimePicker.cs
- ActivityContext.cs
- StoryFragments.cs
- TableLayoutPanel.cs
- LinqMaximalSubtreeNominator.cs
- WhitespaceRuleReader.cs
- RoutedPropertyChangedEventArgs.cs
- PropertyCondition.cs
- SamlAssertion.cs
- HostedTcpTransportManager.cs
- ListItem.cs
- BaseTemplateCodeDomTreeGenerator.cs
- DataShape.cs
- UnsafeNativeMethods.cs
- ItemChangedEventArgs.cs
- DataGridClipboardCellContent.cs
- EntityModelSchemaGenerator.cs
- TabItemAutomationPeer.cs
- ISO2022Encoding.cs
- Table.cs
- versioninfo.cs
- ParameterBuilder.cs
- DefaultPrintController.cs
- WebPartManagerDesigner.cs
- CachedFontFamily.cs
- AnnotationResourceChangedEventArgs.cs
- BinaryObjectReader.cs
- NegatedCellConstant.cs
- AppDomainUnloadedException.cs
- DependentList.cs
- Module.cs
- Material.cs
- EventlogProvider.cs
- InvalidPrinterException.cs
- ListManagerBindingsCollection.cs
- AsyncSerializedWorker.cs
- XPathSelectionIterator.cs
- ObjectStateEntry.cs
- IntSumAggregationOperator.cs
- ElementMarkupObject.cs
- DataGridRelationshipRow.cs
- EventMappingSettings.cs
- TagPrefixAttribute.cs
- SafeBitVector32.cs
- ProxySimple.cs
- ComponentCollection.cs
- SimpleWorkerRequest.cs
- Renderer.cs
- VectorCollectionConverter.cs
- MimePart.cs
- PersonalizationAdministration.cs
- CaseStatement.cs
- TypeNameHelper.cs
- SerTrace.cs
- TemplateInstanceAttribute.cs
- LogEntryHeaderSerializer.cs
- ForeignConstraint.cs
- AuthenticationService.cs
- ConfigurationManagerHelperFactory.cs
- URIFormatException.cs
- OutputCacheProfile.cs
- _CommandStream.cs
- TransformerInfoCollection.cs
- OutOfMemoryException.cs
- StylusCaptureWithinProperty.cs