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
- invalidudtexception.cs
- DmlSqlGenerator.cs
- contentDescriptor.cs
- NavigationProperty.cs
- ProtocolsConfigurationEntry.cs
- PictureBox.cs
- PropertyDescriptorCollection.cs
- UInt16Storage.cs
- ParentUndoUnit.cs
- FontUnit.cs
- MatrixConverter.cs
- ListViewCancelEventArgs.cs
- XmlElementCollection.cs
- Condition.cs
- DesignerCommandSet.cs
- CacheOutputQuery.cs
- ThemeableAttribute.cs
- TabControl.cs
- SqlStream.cs
- ImageMap.cs
- RegexWorker.cs
- DataGridViewColumnCollection.cs
- OpCodes.cs
- XComponentModel.cs
- PointKeyFrameCollection.cs
- KeyConverter.cs
- StringPropertyBuilder.cs
- CryptoApi.cs
- FtpCachePolicyElement.cs
- SecurityRuntime.cs
- StickyNoteAnnotations.cs
- DataBindingValueUIHandler.cs
- ActivityWithResult.cs
- StoryFragments.cs
- Stroke.cs
- Item.cs
- ScriptManagerProxy.cs
- DropShadowEffect.cs
- CommandEventArgs.cs
- MenuScrollingVisibilityConverter.cs
- ErrorFormatter.cs
- PersonalizationProviderHelper.cs
- TextElement.cs
- PageParser.cs
- ClientFormsIdentity.cs
- SamlAttributeStatement.cs
- InstalledFontCollection.cs
- WebPartCatalogAddVerb.cs
- DoubleConverter.cs
- CanonicalFormWriter.cs
- IPEndPointCollection.cs
- Transform3D.cs
- ConstructorNeedsTagAttribute.cs
- __TransparentProxy.cs
- SqlDelegatedTransaction.cs
- XmlSchemaRedefine.cs
- NavigateEvent.cs
- RowToParametersTransformer.cs
- LogReservationCollection.cs
- FontWeights.cs
- HostingEnvironmentException.cs
- Main.cs
- DataList.cs
- InstanceOwnerException.cs
- Cursors.cs
- IProducerConsumerCollection.cs
- PointLight.cs
- OneOfTypeConst.cs
- DoubleCollectionConverter.cs
- ColorConverter.cs
- _BasicClient.cs
- SqlBooleanizer.cs
- Group.cs
- DataGridViewCheckBoxColumn.cs
- ToolStripDropDownButton.cs
- unsafeIndexingFilterStream.cs
- ComboBoxDesigner.cs
- XmlAttributes.cs
- SessionIDManager.cs
- ToolStripContainer.cs
- Trace.cs
- PluralizationServiceUtil.cs
- ReachDocumentReferenceSerializer.cs
- FixedElement.cs
- CompilerError.cs
- DetailsViewCommandEventArgs.cs
- HyperlinkAutomationPeer.cs
- TransformGroup.cs
- QueryStringParameter.cs
- ResolveDuplexCD1AsyncResult.cs
- ReaderOutput.cs
- MsmqIntegrationBindingCollectionElement.cs
- ToolStripGrip.cs
- IListConverters.cs
- ProjectionPlanCompiler.cs
- BitmapSource.cs
- XhtmlConformanceSection.cs
- AuthStoreRoleProvider.cs
- UdpDuplexChannel.cs
- OleDbException.cs