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
- JsonGlobals.cs
- LazyInitializer.cs
- DataGridColumn.cs
- NumericExpr.cs
- SoapElementAttribute.cs
- DBSchemaTable.cs
- WorkflowPersistenceContext.cs
- DynamicValidator.cs
- QilTargetType.cs
- StrokeCollection2.cs
- SingleConverter.cs
- XmlSchemaResource.cs
- WebBrowserNavigatingEventHandler.cs
- DocumentOrderQuery.cs
- XPathCompileException.cs
- XamlWriterExtensions.cs
- ApplicationContext.cs
- StructuredProperty.cs
- ListDictionaryInternal.cs
- AdapterDictionary.cs
- Enlistment.cs
- FormViewUpdatedEventArgs.cs
- _NetRes.cs
- Point.cs
- DelimitedListTraceListener.cs
- DiscardableAttribute.cs
- SspiNegotiationTokenAuthenticator.cs
- EntityDataSource.cs
- DataGridColumnDropSeparator.cs
- LiteralControl.cs
- DataViewListener.cs
- C14NUtil.cs
- ReferenceCountedObject.cs
- ScaleTransform3D.cs
- InheritanceContextHelper.cs
- TargetConverter.cs
- SmtpLoginAuthenticationModule.cs
- ThemeDirectoryCompiler.cs
- RawStylusInputCustomDataList.cs
- CollectionDataContract.cs
- SectionUpdates.cs
- CodeGenerator.cs
- Identity.cs
- EventDescriptorCollection.cs
- AlignmentXValidation.cs
- GeneralTransform3D.cs
- Stack.cs
- WebPartManager.cs
- XmlSchemas.cs
- Dispatcher.cs
- EntityDataReader.cs
- ProfileService.cs
- ExpressionEditorAttribute.cs
- xmlformatgeneratorstatics.cs
- WebPermission.cs
- KeyConverter.cs
- ConsoleTraceListener.cs
- GiveFeedbackEvent.cs
- ServiceContractAttribute.cs
- XmlHierarchicalEnumerable.cs
- PersianCalendar.cs
- StyleBamlRecordReader.cs
- SchemaDeclBase.cs
- DataStreams.cs
- CellQuery.cs
- WindowsListViewItem.cs
- CompilerGlobalScopeAttribute.cs
- HttpBindingExtension.cs
- TraceLog.cs
- Model3DGroup.cs
- ComponentGlyph.cs
- DataGridViewColumnConverter.cs
- ParseChildrenAsPropertiesAttribute.cs
- QfeChecker.cs
- Options.cs
- TrackingStringDictionary.cs
- DeploymentSection.cs
- DesignerActionItem.cs
- TreeIterators.cs
- TCPClient.cs
- Keywords.cs
- AlternationConverter.cs
- DataGridViewCellConverter.cs
- HttpWebResponse.cs
- IisTraceWebEventProvider.cs
- XmlDocumentSerializer.cs
- SrgsRuleRef.cs
- ReplyChannelBinder.cs
- CodeRemoveEventStatement.cs
- XmlParserContext.cs
- TypeSystemProvider.cs
- HtmlTable.cs
- ColumnWidthChangingEvent.cs
- BitmapEffectDrawing.cs
- IntSecurity.cs
- UndoEngine.cs
- EntityKey.cs
- NonValidatingSecurityTokenAuthenticator.cs
- WebPartActionVerb.cs
- EdmValidator.cs