Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- TreeNodeConverter.cs
- UnicodeEncoding.cs
- PeerObject.cs
- SystemInformation.cs
- XmlSchemaAttribute.cs
- TabPage.cs
- DrawingBrush.cs
- NullRuntimeConfig.cs
- KeyToListMap.cs
- RelationshipNavigation.cs
- XsltLibrary.cs
- SaveLedgerEntryRequest.cs
- ModelItemExtensions.cs
- ReadOnlyHierarchicalDataSourceView.cs
- ElementsClipboardData.cs
- Rect3DValueSerializer.cs
- DbDataAdapter.cs
- ProxyWebPart.cs
- List.cs
- SpecularMaterial.cs
- ExternalFile.cs
- ClientData.cs
- EdmTypeAttribute.cs
- CacheDependency.cs
- ColumnReorderedEventArgs.cs
- WebBrowserContainer.cs
- DbConnectionStringBuilder.cs
- PriorityRange.cs
- Attribute.cs
- ConnectionPoolManager.cs
- ParserExtension.cs
- ClaimTypes.cs
- Vector3D.cs
- _NetworkingPerfCounters.cs
- QilInvokeLateBound.cs
- SystemFonts.cs
- ObjectStateEntry.cs
- DefaultExpressionVisitor.cs
- Baml6ConstructorInfo.cs
- GridViewEditEventArgs.cs
- HtmlSelect.cs
- ExportException.cs
- ImageBrush.cs
- TextTreeInsertElementUndoUnit.cs
- WinEventQueueItem.cs
- FusionWrap.cs
- _NegoStream.cs
- CodeTryCatchFinallyStatement.cs
- SchemaTableColumn.cs
- TextRangeEditTables.cs
- XmlHierarchicalDataSourceView.cs
- ProxyHwnd.cs
- ProcessInfo.cs
- FileEnumerator.cs
- Timer.cs
- SqlTrackingQuery.cs
- SelectionBorderGlyph.cs
- ArrayMergeHelper.cs
- XmlSchemaRedefine.cs
- SimpleType.cs
- ColorTransform.cs
- ConfigXmlCDataSection.cs
- XmlNotation.cs
- SoapExtension.cs
- RegionData.cs
- StructuredTypeInfo.cs
- DependencyObjectPropertyDescriptor.cs
- SAPICategories.cs
- Helper.cs
- TraceListeners.cs
- BooleanAnimationBase.cs
- ReversePositionQuery.cs
- RichTextBox.cs
- ObjectDataSourceFilteringEventArgs.cs
- DataGridComboBoxColumn.cs
- ExpressionVisitor.cs
- HandledMouseEvent.cs
- TableLayoutCellPaintEventArgs.cs
- MediaContext.cs
- ContentTextAutomationPeer.cs
- ProcessInfo.cs
- CommandID.cs
- ApplicationDirectoryMembershipCondition.cs
- NativeMethods.cs
- ServiceBusyException.cs
- ApplicationServiceManager.cs
- DataColumn.cs
- ProviderConnectionPoint.cs
- DesignerVerbCollection.cs
- BrushMappingModeValidation.cs
- ObjectHelper.cs
- DetailsViewRow.cs
- Pts.cs
- MbpInfo.cs
- MultipartContentParser.cs
- EarlyBoundInfo.cs
- SafeSecurityHelper.cs
- AmbientLight.cs
- SqlUnionizer.cs
- ResourceContainer.cs