Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlMethodTransformer.cs / 1305376 / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- _ScatterGatherBuffers.cs
- FilterFactory.cs
- TriggerAction.cs
- CacheRequest.cs
- Group.cs
- FormattedText.cs
- ConditionalDesigner.cs
- BooleanStorage.cs
- MultiBindingExpression.cs
- ApplicationServiceHelper.cs
- DataGridViewSelectedRowCollection.cs
- Cursor.cs
- ModelServiceImpl.cs
- DataObjectFieldAttribute.cs
- ModelItemImpl.cs
- InputDevice.cs
- BufferModeSettings.cs
- DBAsyncResult.cs
- SolidBrush.cs
- SafeUserTokenHandle.cs
- Header.cs
- CodeTypeMember.cs
- HandledEventArgs.cs
- MappingItemCollection.cs
- RotateTransform.cs
- FilePresentation.cs
- Utils.cs
- RepeatInfo.cs
- HMAC.cs
- StackOverflowException.cs
- TagPrefixAttribute.cs
- InkCanvasFeedbackAdorner.cs
- SaveWorkflowAsyncResult.cs
- Selector.cs
- NetDataContractSerializer.cs
- EventProvider.cs
- XPathAncestorIterator.cs
- StreamResourceInfo.cs
- InternalSendMessage.cs
- AudienceUriMode.cs
- SafeNativeMethods.cs
- Brush.cs
- MasterPageBuildProvider.cs
- TaskFileService.cs
- StatusCommandUI.cs
- DataContract.cs
- PathStreamGeometryContext.cs
- DBCommand.cs
- TextAnchor.cs
- XmlBinaryReader.cs
- UpdateTracker.cs
- SystemGatewayIPAddressInformation.cs
- ToolStripSplitButton.cs
- StructuredTypeInfo.cs
- HitTestParameters3D.cs
- TransactionProxy.cs
- FlowDocumentReaderAutomationPeer.cs
- DPTypeDescriptorContext.cs
- MarshalByRefObject.cs
- Camera.cs
- ListViewItemEventArgs.cs
- XmlElementAttributes.cs
- AdjustableArrowCap.cs
- D3DImage.cs
- CompositeCollectionView.cs
- IInstanceTable.cs
- XmlUtilWriter.cs
- GenericTypeParameterBuilder.cs
- DrawingGroupDrawingContext.cs
- VariableQuery.cs
- ContentPosition.cs
- MaskDescriptor.cs
- ArgIterator.cs
- TimeSpan.cs
- FontSizeConverter.cs
- DataGridItemEventArgs.cs
- OletxVolatileEnlistment.cs
- ImageListStreamer.cs
- EncodingDataItem.cs
- XamlSerializer.cs
- PersonalizationStateQuery.cs
- GrammarBuilderDictation.cs
- DynamicValidatorEventArgs.cs
- PackWebRequestFactory.cs
- AutomationAttributeInfo.cs
- DocumentGridPage.cs
- DESCryptoServiceProvider.cs
- CodeAttachEventStatement.cs
- objectquery_tresulttype.cs
- ChannelProtectionRequirements.cs
- DataListCommandEventArgs.cs
- ProfileBuildProvider.cs
- AncestorChangedEventArgs.cs
- EmptyQuery.cs
- ControlAdapter.cs
- StorageConditionPropertyMapping.cs
- TemplateControlBuildProvider.cs
- ImageBrush.cs
- DataServiceBuildProvider.cs
- safesecurityhelperavalon.cs