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
- MetadataWorkspace.cs
- ScrollEventArgs.cs
- SelectionPattern.cs
- RC2CryptoServiceProvider.cs
- FixedFindEngine.cs
- ThicknessConverter.cs
- SelectionWordBreaker.cs
- CallSite.cs
- Parser.cs
- Propagator.Evaluator.cs
- FieldBuilder.cs
- StopStoryboard.cs
- CultureTable.cs
- StyleBamlRecordReader.cs
- NetTcpBindingElement.cs
- DeadCharTextComposition.cs
- WebPartMenu.cs
- DataExpression.cs
- QuestionEventArgs.cs
- OleDbException.cs
- XmlStreamNodeWriter.cs
- DesignParameter.cs
- UmAlQuraCalendar.cs
- Line.cs
- LifetimeServices.cs
- Attributes.cs
- DefaultDialogButtons.cs
- ConnectionStringsExpressionBuilder.cs
- DesignerEditorPartChrome.cs
- Oci.cs
- DoubleConverter.cs
- XmlBinaryReader.cs
- Variable.cs
- OleDbConnectionFactory.cs
- PathFigureCollection.cs
- CreateUserErrorEventArgs.cs
- KeyPressEvent.cs
- DataContractSet.cs
- TextTreeTextNode.cs
- SafeNativeMethods.cs
- CompiledXpathExpr.cs
- TextEditorParagraphs.cs
- MatrixTransform3D.cs
- RuntimeHandles.cs
- JsonGlobals.cs
- RootBuilder.cs
- FunctionQuery.cs
- SystemWebExtensionsSectionGroup.cs
- ListSurrogate.cs
- PolicyStatement.cs
- safemediahandle.cs
- PixelFormatConverter.cs
- SecurityVersion.cs
- DynamicResourceExtension.cs
- EntryPointNotFoundException.cs
- SamlAttribute.cs
- RowToFieldTransformer.cs
- CqlGenerator.cs
- FixedDocumentPaginator.cs
- SafeBitVector32.cs
- DecimalStorage.cs
- IListConverters.cs
- GeometryGroup.cs
- SoapIgnoreAttribute.cs
- SingleTagSectionHandler.cs
- BidOverLoads.cs
- ImageAnimator.cs
- AddInAdapter.cs
- StateChangeEvent.cs
- ResourceIDHelper.cs
- SamlAdvice.cs
- BackStopAuthenticationModule.cs
- ResourceDisplayNameAttribute.cs
- TemplateKey.cs
- BitmapFrameDecode.cs
- AnchoredBlock.cs
- DocumentApplicationState.cs
- PagesSection.cs
- EmptyStringExpandableObjectConverter.cs
- XPathItem.cs
- RenderTargetBitmap.cs
- BaseCollection.cs
- ProjectedSlot.cs
- HitTestParameters.cs
- BitArray.cs
- KnownColorTable.cs
- RequestQueryProcessor.cs
- ColumnHeaderConverter.cs
- AppDomainAttributes.cs
- XmlDocumentType.cs
- CroppedBitmap.cs
- WebPartCancelEventArgs.cs
- CollectionType.cs
- BaseAppDomainProtocolHandler.cs
- ImageEditor.cs
- XmlSerializerNamespaces.cs
- ScriptReference.cs
- Convert.cs
- DispatchWrapper.cs
- URLBuilder.cs