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
- AccessControlEntry.cs
- KeyboardNavigation.cs
- ZipIOBlockManager.cs
- Slider.cs
- SqlBulkCopyColumnMappingCollection.cs
- OperationBehaviorAttribute.cs
- CodeDomConfigurationHandler.cs
- XPathDocumentBuilder.cs
- InfocardClientCredentials.cs
- SharedConnectionListener.cs
- WebPartCollection.cs
- MemoryStream.cs
- ThicknessConverter.cs
- AssemblySettingAttributes.cs
- ButtonField.cs
- XmlDictionaryReaderQuotas.cs
- PeerIPHelper.cs
- XmlProcessingInstruction.cs
- MatrixTransform3D.cs
- AspCompat.cs
- PenThreadPool.cs
- XmlSignatureManifest.cs
- WebPartConnection.cs
- MD5Cng.cs
- ErrorHandler.cs
- FolderBrowserDialog.cs
- SqlWebEventProvider.cs
- ParameterEditorUserControl.cs
- IntegerValidator.cs
- ArgumentException.cs
- StrongName.cs
- DependencyPropertyConverter.cs
- ResourcesBuildProvider.cs
- SoapFault.cs
- XmlCharType.cs
- ServiceProviders.cs
- CacheChildrenQuery.cs
- InternalSafeNativeMethods.cs
- WebConfigurationHostFileChange.cs
- RangeValidator.cs
- StackBuilderSink.cs
- HttpFileCollection.cs
- RtType.cs
- RuntimeHandles.cs
- FilteredDataSetHelper.cs
- PerspectiveCamera.cs
- ToolStripDropDownClosedEventArgs.cs
- SharedHttpsTransportManager.cs
- TextTreeDeleteContentUndoUnit.cs
- WebBrowserHelper.cs
- TextParagraphProperties.cs
- ExpressionStringBuilder.cs
- SocketStream.cs
- BigIntegerStorage.cs
- UserPersonalizationStateInfo.cs
- ListSortDescriptionCollection.cs
- DetailsViewUpdatedEventArgs.cs
- Helpers.cs
- ByteStorage.cs
- StylusPointPropertyUnit.cs
- EntityTransaction.cs
- ProviderConnectionPoint.cs
- XmlTextAttribute.cs
- QueryPageSettingsEventArgs.cs
- ConfigurationElement.cs
- DataGridViewComboBoxColumnDesigner.cs
- propertytag.cs
- SiteMapNodeCollection.cs
- DataGridViewHitTestInfo.cs
- ReadOnlyAttribute.cs
- ArraySegment.cs
- Encoding.cs
- View.cs
- NamespaceQuery.cs
- LineSegment.cs
- SapiRecognizer.cs
- CAGDesigner.cs
- HttpListenerResponse.cs
- DataListCommandEventArgs.cs
- MetadataSerializer.cs
- PerfCounters.cs
- XmlIgnoreAttribute.cs
- InfoCardRSAPKCS1SignatureDeformatter.cs
- SQLStringStorage.cs
- KnownAssemblyEntry.cs
- ToolStripPanelRow.cs
- SeparatorAutomationPeer.cs
- TimeIntervalCollection.cs
- MetadataCache.cs
- ActivityBuilderHelper.cs
- FieldAccessException.cs
- ColumnResizeUndoUnit.cs
- ExtendedProperty.cs
- AuthenticationModuleElementCollection.cs
- AutoGeneratedField.cs
- ArgumentException.cs
- ObjectDataSourceChooseTypePanel.cs
- DataGridViewCell.cs
- ValueQuery.cs
- SqlXml.cs