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
- MobileFormsAuthentication.cs
- ImpersonateTokenRef.cs
- AttachedAnnotationChangedEventArgs.cs
- COMException.cs
- AccessViolationException.cs
- InputGestureCollection.cs
- TextServicesDisplayAttributePropertyRanges.cs
- DataSourceDescriptorCollection.cs
- IsolatedStoragePermission.cs
- WpfXamlLoader.cs
- ConditionValidator.cs
- _Connection.cs
- ConfigurationValues.cs
- DataSourceHelper.cs
- ReplyChannelBinder.cs
- ResourcePermissionBase.cs
- Polyline.cs
- CompressionTransform.cs
- PagePropertiesChangingEventArgs.cs
- ZipArchive.cs
- SettingsBase.cs
- ArgumentNullException.cs
- VsPropertyGrid.cs
- ConstructorNeedsTagAttribute.cs
- HyperLinkStyle.cs
- OracleParameterCollection.cs
- WebPartEventArgs.cs
- Path.cs
- UnsafeNativeMethods.cs
- assemblycache.cs
- ObjectItemCollectionAssemblyCacheEntry.cs
- WindowsUpDown.cs
- OpenTypeLayout.cs
- GridViewUpdatedEventArgs.cs
- Number.cs
- DataGridViewRow.cs
- StylusPoint.cs
- PrinterUnitConvert.cs
- IChannel.cs
- MachineKeySection.cs
- ServiceOperation.cs
- WorkflowRuntimeServiceElementCollection.cs
- CustomCategoryAttribute.cs
- PackageDigitalSignature.cs
- FloaterParagraph.cs
- EntityPropertyMappingAttribute.cs
- GlyphRun.cs
- WorkflowShape.cs
- WebServiceEnumData.cs
- CodeAssignStatement.cs
- DataControlFieldCell.cs
- filewebresponse.cs
- SafeBitVector32.cs
- NativeMethods.cs
- objectresult_tresulttype.cs
- LinearQuaternionKeyFrame.cs
- Pen.cs
- GetPageNumberCompletedEventArgs.cs
- CompareValidator.cs
- ListViewItem.cs
- Message.cs
- UnsafeNativeMethods.cs
- EventLogPermissionHolder.cs
- Renderer.cs
- FieldAccessException.cs
- RuntimeWrappedException.cs
- SerializationInfo.cs
- TextBlockAutomationPeer.cs
- FilterElement.cs
- KnownTypeDataContractResolver.cs
- GridItemCollection.cs
- QilReference.cs
- Vars.cs
- Helpers.cs
- StructuralCache.cs
- XmlILModule.cs
- SecUtil.cs
- TargetControlTypeCache.cs
- User.cs
- LayoutEditorPart.cs
- _ListenerRequestStream.cs
- WebPartZone.cs
- RectValueSerializer.cs
- MSAANativeProvider.cs
- WebException.cs
- AttachedProperty.cs
- GroupBoxRenderer.cs
- TextControlDesigner.cs
- TypeDelegator.cs
- ServiceHostFactory.cs
- BaseTemplateCodeDomTreeGenerator.cs
- ExtendedTransformFactory.cs
- BrowserTree.cs
- SqlError.cs
- SapiRecognizer.cs
- MessageOperationFormatter.cs
- BaseDataBoundControl.cs
- TreeNode.cs
- OracleRowUpdatedEventArgs.cs
- RadioButtonList.cs