Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataEntity / System / Data / Objects / ELinq / ExpressionEvaluator.cs / 1 / ExpressionEvaluator.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] //--------------------------------------------------------------------- using System.Linq.Expressions; using System.Diagnostics; using System.Reflection; using System.Linq; using System.Data.Metadata.Edm; using System.Collections.Generic; namespace System.Data.Objects.ELinq { ////// Class handling in-memory translation of expressions that are /// not supported through the standard LINQ translation. Supports /// only expressions that can be efficiently evaluated at runtime. /// internal static class ExpressionEvaluator { private static readonly IQueryProvider s_compilerQueryService = Enumerable.Empty().AsQueryable().Provider; /// /// For CompiledQuery, handles sub-expressions of the form: /// /// ctx.ObjectQueryProperty /// /// where ctx is the context parameter, e.g.: /// /// CompiledQuery.Compile((ctx, ...) => ctx...) /// /// NOTE: this method assumes that all client evaluatable nodes have been evaluated /// /// internal static bool TryEvaluateRootQuery(BindingContext bindingContext, Expression expression, out ObjectQuery rootQuery) { rootQuery = null; if (bindingContext.ObjectContext == null) { // there is no root context parameter, so the expression can't match return false; } if (!typeof(ObjectQuery).IsAssignableFrom(expression.Type)) { // if the expression doesn't return an ObjectQuery<>, it can't match the pattern return false; } Expression currentExpression = expression; // check that the remaining expression is of the form ctx.ObjectQueryProperty if (currentExpression.NodeType != ExpressionType.MemberAccess) { return false; } var memberExpression = (MemberExpression)currentExpression; currentExpression = memberExpression.Expression; if (null == currentExpression || currentExpression.NodeType != ExpressionType.Parameter) { return false; } ParameterExpression parameterExpression = (ParameterExpression)currentExpression; if (!bindingContext.IsRootContextParameter(parameterExpression)) { return false; } var queryCreator = (IRootQueryCreator)Activator.CreateInstance(typeof(RootQueryCreator<,>).MakeGenericType( parameterExpression.Type, expression.Type)); rootQuery = queryCreator.Invoke(expression, parameterExpression, bindingContext.ObjectContext); return true; } [Conditional("DEBUG")] private static void DebugOnlyVerifyMethodOverloadCount(Type type, string methodName, int expectedCount) { int count = 0; foreach (var m in type.GetMethods()) { if (m.Name == methodName) { count++; } } Debug.Assert(count == expectedCount, "Did you add a new " + methodName + " overload?"); } ////// Evaluates the given expression using the default in-memory compiler. /// /// Expression to evaluate. Must not be null. ///Result of evaluating the expression. internal static object EvaluateExpression(Expression expression) { return s_compilerQueryService.Execute(expression); } // this method is only correct when returning true // if you have also determined that all the nodes below it // also return true internal static bool IsExpressionNodeClientEvaluatable(Expression expression) { if (null == expression) { return false; } switch (expression.NodeType) { case ExpressionType.New: { // support construction of primitive types PrimitiveType primitiveType; if (!ClrProviderManifest.Instance.TryGetPrimitiveType(TypeSystem.GetNonNullableType(expression.Type), out primitiveType)) { return false; } return true; } case ExpressionType.Constant: return true; case ExpressionType.NewArrayInit: { // allow initialization of byte[] 'literals' return (typeof(byte[]) == expression.Type); } case ExpressionType.Convert: { return true; } default: return false; } } // this method is only correct when returning true // if you have also determined that all the nodes below it // also return true from (IsExpressionNodeAClosure || IsExpressionNodeClientEvaluatable) internal static bool IsExpressionNodeAClosure(Expression expression) { Debug.Assert(null != expression); if (ExpressionType.MemberAccess == expression.NodeType) { MemberExpression memberExpression = (MemberExpression)expression; if (memberExpression.Member.MemberType == MemberTypes.Property) { return !(ExpressionConverter.CanTranslatePropertyInfo((PropertyInfo)memberExpression.Member)); } return true; } return false; } private interface IRootQueryCreator { ObjectQuery Invoke(Expression body, ParameterExpression parameter, ObjectContext objectContext); } private class RootQueryCreator: IRootQueryCreator where T_Context : ObjectContext where T_ObjectQuery : ObjectQuery { public ObjectQuery Invoke(Expression body, ParameterExpression parameter, ObjectContext objectContext) { return Expression.Lambda >(body, parameter).Compile()((T_Context)objectContext); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] //--------------------------------------------------------------------- using System.Linq.Expressions; using System.Diagnostics; using System.Reflection; using System.Linq; using System.Data.Metadata.Edm; using System.Collections.Generic; namespace System.Data.Objects.ELinq { ////// Class handling in-memory translation of expressions that are /// not supported through the standard LINQ translation. Supports /// only expressions that can be efficiently evaluated at runtime. /// internal static class ExpressionEvaluator { private static readonly IQueryProvider s_compilerQueryService = Enumerable.Empty().AsQueryable().Provider; /// /// For CompiledQuery, handles sub-expressions of the form: /// /// ctx.ObjectQueryProperty /// /// where ctx is the context parameter, e.g.: /// /// CompiledQuery.Compile((ctx, ...) => ctx...) /// /// NOTE: this method assumes that all client evaluatable nodes have been evaluated /// /// internal static bool TryEvaluateRootQuery(BindingContext bindingContext, Expression expression, out ObjectQuery rootQuery) { rootQuery = null; if (bindingContext.ObjectContext == null) { // there is no root context parameter, so the expression can't match return false; } if (!typeof(ObjectQuery).IsAssignableFrom(expression.Type)) { // if the expression doesn't return an ObjectQuery<>, it can't match the pattern return false; } Expression currentExpression = expression; // check that the remaining expression is of the form ctx.ObjectQueryProperty if (currentExpression.NodeType != ExpressionType.MemberAccess) { return false; } var memberExpression = (MemberExpression)currentExpression; currentExpression = memberExpression.Expression; if (null == currentExpression || currentExpression.NodeType != ExpressionType.Parameter) { return false; } ParameterExpression parameterExpression = (ParameterExpression)currentExpression; if (!bindingContext.IsRootContextParameter(parameterExpression)) { return false; } var queryCreator = (IRootQueryCreator)Activator.CreateInstance(typeof(RootQueryCreator<,>).MakeGenericType( parameterExpression.Type, expression.Type)); rootQuery = queryCreator.Invoke(expression, parameterExpression, bindingContext.ObjectContext); return true; } [Conditional("DEBUG")] private static void DebugOnlyVerifyMethodOverloadCount(Type type, string methodName, int expectedCount) { int count = 0; foreach (var m in type.GetMethods()) { if (m.Name == methodName) { count++; } } Debug.Assert(count == expectedCount, "Did you add a new " + methodName + " overload?"); } ////// Evaluates the given expression using the default in-memory compiler. /// /// Expression to evaluate. Must not be null. ///Result of evaluating the expression. internal static object EvaluateExpression(Expression expression) { return s_compilerQueryService.Execute(expression); } // this method is only correct when returning true // if you have also determined that all the nodes below it // also return true internal static bool IsExpressionNodeClientEvaluatable(Expression expression) { if (null == expression) { return false; } switch (expression.NodeType) { case ExpressionType.New: { // support construction of primitive types PrimitiveType primitiveType; if (!ClrProviderManifest.Instance.TryGetPrimitiveType(TypeSystem.GetNonNullableType(expression.Type), out primitiveType)) { return false; } return true; } case ExpressionType.Constant: return true; case ExpressionType.NewArrayInit: { // allow initialization of byte[] 'literals' return (typeof(byte[]) == expression.Type); } case ExpressionType.Convert: { return true; } default: return false; } } // this method is only correct when returning true // if you have also determined that all the nodes below it // also return true from (IsExpressionNodeAClosure || IsExpressionNodeClientEvaluatable) internal static bool IsExpressionNodeAClosure(Expression expression) { Debug.Assert(null != expression); if (ExpressionType.MemberAccess == expression.NodeType) { MemberExpression memberExpression = (MemberExpression)expression; if (memberExpression.Member.MemberType == MemberTypes.Property) { return !(ExpressionConverter.CanTranslatePropertyInfo((PropertyInfo)memberExpression.Member)); } return true; } return false; } private interface IRootQueryCreator { ObjectQuery Invoke(Expression body, ParameterExpression parameter, ObjectContext objectContext); } private class RootQueryCreator: IRootQueryCreator where T_Context : ObjectContext where T_ObjectQuery : ObjectQuery { public ObjectQuery Invoke(Expression body, ParameterExpression parameter, ObjectContext objectContext) { return Expression.Lambda >(body, parameter).Compile()((T_Context)objectContext); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SafeRightsManagementHandle.cs
- NoClickablePointException.cs
- BaseDataBoundControl.cs
- Size3DConverter.cs
- WebPartDisplayModeEventArgs.cs
- ContentControl.cs
- SqlDelegatedTransaction.cs
- IIS7UserPrincipal.cs
- OletxVolatileEnlistment.cs
- WorkflowInstance.cs
- AddInActivator.cs
- FixedStringLookup.cs
- XmlSchemaObject.cs
- ExtractorMetadata.cs
- ManualWorkflowSchedulerService.cs
- UnsafeNativeMethods.cs
- CanExecuteRoutedEventArgs.cs
- XappLauncher.cs
- StringToken.cs
- XmlCompatibilityReader.cs
- ServiceOperationListItemList.cs
- CodeDomDecompiler.cs
- TextRunCache.cs
- ReceiveMessageAndVerifySecurityAsyncResultBase.cs
- ScalarConstant.cs
- ExpressionDumper.cs
- TemplateBindingExpression.cs
- selecteditemcollection.cs
- WorkflowTimerService.cs
- GlyphTypeface.cs
- HttpModulesSection.cs
- Slider.cs
- SecurityDescriptor.cs
- CanonicalXml.cs
- ListItemConverter.cs
- GraphicsContainer.cs
- DataSvcMapFile.cs
- SystemUdpStatistics.cs
- HandlerWithFactory.cs
- TdsValueSetter.cs
- InfiniteIntConverter.cs
- webeventbuffer.cs
- XsltOutput.cs
- ObjectConverter.cs
- Evaluator.cs
- DES.cs
- RadioButtonRenderer.cs
- LabelLiteral.cs
- RadioButtonStandardAdapter.cs
- Configuration.cs
- TransactionsSectionGroup.cs
- UIHelper.cs
- _FtpControlStream.cs
- InheritanceRules.cs
- SecurityElement.cs
- RichTextBoxConstants.cs
- FormViewPagerRow.cs
- WebPartEditVerb.cs
- LinearGradientBrush.cs
- WebPartUtil.cs
- MimeWriter.cs
- WebPart.cs
- NativeMethodsCLR.cs
- ApplicationFileCodeDomTreeGenerator.cs
- documentsequencetextcontainer.cs
- CodeGenerator.cs
- NavigationPropertyEmitter.cs
- IdentifierElement.cs
- StyleSheet.cs
- ForEachAction.cs
- CapabilitiesAssignment.cs
- UserInitiatedNavigationPermission.cs
- ellipse.cs
- Parallel.cs
- DbConnectionInternal.cs
- versioninfo.cs
- ToolStripMenuItem.cs
- MenuItemStyleCollection.cs
- Exceptions.cs
- RowVisual.cs
- cookiecontainer.cs
- TypeExtensionConverter.cs
- FontFamilyIdentifier.cs
- TextViewBase.cs
- DrawingContextWalker.cs
- TabControl.cs
- CompilerResults.cs
- ClearCollection.cs
- CdpEqualityComparer.cs
- WindowsListViewGroup.cs
- BindingMAnagerBase.cs
- TextEditorDragDrop.cs
- BinaryReader.cs
- CDSCollectionETWBCLProvider.cs
- DataGridColumnStyleMappingNameEditor.cs
- NeutralResourcesLanguageAttribute.cs
- StandardCommands.cs
- RoutedEventValueSerializer.cs
- UnsafeNativeMethods.cs
- PageCodeDomTreeGenerator.cs