Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DLinq / Dlinq / SqlClient / Query / SqlMethodTransformer.cs / 2 / 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
- InvalidPipelineStoreException.cs
- PageCatalogPart.cs
- HttpListener.cs
- EventToken.cs
- _LocalDataStore.cs
- MatrixTransform3D.cs
- FloaterParagraph.cs
- DecimalAnimationBase.cs
- EditBehavior.cs
- XpsFontSerializationService.cs
- PathFigure.cs
- WebPartTransformer.cs
- RegisteredExpandoAttribute.cs
- HandoffBehavior.cs
- Byte.cs
- PersonalizablePropertyEntry.cs
- NamedPipeConnectionPool.cs
- SQLConvert.cs
- SchemaTypeEmitter.cs
- EncryptedHeaderXml.cs
- ErrorEventArgs.cs
- QuerySettings.cs
- HtmlElementCollection.cs
- Parsers.cs
- ContentHostHelper.cs
- ConfigPathUtility.cs
- List.cs
- AsyncSerializedWorker.cs
- HandlerBase.cs
- ToolStripMenuItemCodeDomSerializer.cs
- TargetControlTypeAttribute.cs
- WebControlAdapter.cs
- XmlSchemaAnnotation.cs
- BindingCollection.cs
- TreeNodeBinding.cs
- DataMemberListEditor.cs
- SafeNativeMethods.cs
- UInt64.cs
- FamilyTypeface.cs
- mansign.cs
- AuthorizationBehavior.cs
- UiaCoreTypesApi.cs
- DesignerAdapterUtil.cs
- DataGridViewHeaderCell.cs
- HtmlButton.cs
- PermissionListSet.cs
- OperationResponse.cs
- MemberRelationshipService.cs
- OAVariantLib.cs
- DBCommand.cs
- EntityRecordInfo.cs
- RadioButton.cs
- HasCopySemanticsAttribute.cs
- ImageSource.cs
- StylusPointPropertyInfoDefaults.cs
- WebBrowserNavigatedEventHandler.cs
- HttpValueCollection.cs
- TrackingProfileDeserializationException.cs
- AttachedPropertyInfo.cs
- CompiledScopeCriteria.cs
- CurrentTimeZone.cs
- XmlElementAttributes.cs
- PolyLineSegment.cs
- ProjectedSlot.cs
- FontFamily.cs
- EmbeddedObject.cs
- DataGridViewCheckBoxColumn.cs
- Stroke.cs
- remotingproxy.cs
- BindingSource.cs
- ellipse.cs
- WmfPlaceableFileHeader.cs
- WindowsSlider.cs
- XmlSchemaGroup.cs
- XmlHelper.cs
- OleDbConnection.cs
- Image.cs
- Hash.cs
- EndOfStreamException.cs
- ToolStripItemEventArgs.cs
- Signature.cs
- DocumentXPathNavigator.cs
- AppLevelCompilationSectionCache.cs
- OperandQuery.cs
- SqlRewriteScalarSubqueries.cs
- HotSpotCollection.cs
- GlobalizationAssembly.cs
- WpfKnownType.cs
- BinaryVersion.cs
- FontFamilyValueSerializer.cs
- ExpressionBindings.cs
- BitmapInitialize.cs
- WhereaboutsReader.cs
- HashRepartitionEnumerator.cs
- PeerName.cs
- ObjectListSelectEventArgs.cs
- PenLineCapValidation.cs
- Parallel.cs
- SwitchElementsCollection.cs
- HTMLTextWriter.cs