Skip to content

ExpressionVisualizer is trying to invoke properties and fails. #148

@sdanyliv

Description

@sdanyliv

In our library, it's common to define properties intended exclusively for use by the LINQ translator when generating SQL, with no valid use outside that context. Typically, these properties throw an exception indicating they're server-side methods and cannot be executed directly. As a result, attempting to examine expressions containing these properties causes the Viewer to fail with an exception.

Simple reproducing example:

namespace ReadableExpressionIssue
{
    internal class Program
    {
        public static class Sql
        {
            public static DateTimeOffset CurrentTimestamp => 
                throw new Exception($"{nameof(CurrentTimestamp)} is server side property and cannot be used outside LINQ query.");
        }

        static void Main(string[] args)
        {
            var items = new List<string> { "a", "b", "c" };

            var query = items.AsQueryable()
                .Select(x => new
                {
                    Item = x,
                    ServerTime = Sql.CurrentTimestamp
                });

            var expression = query.Expression;
        }
    }
}

Exception stack trace:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Exception: CurrentTimestamp is server side property and cannot be used outside LINQ query.
at ReadableExpressionIssue.Program.Sql.get_CurrentTimestamp() in C:\Users\sdanyliv\source\repos\ReadableExpressionIssue\Program.cs:line 8
at InvokeStub_Sql.get_CurrentTimestamp(Object, Object, IntPtr*)
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr) --- End of inner exception stack trace ---
at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
at AgileObjects.ReadableExpressions.Extensions.InternalReflectionExtensions.TryGetValue(MemberInfo member, Object subject, Object& value)
at AgileObjects.ReadableExpressions.Extensions.InternalReflectionExtensions.GetValue(MemberInfo member, Object subject)
at AgileObjects.ReadableExpressions.Extensions.InternalExpressionExtensions.IsCapture(Expression expression, Capture& capture)
at AgileObjects.ReadableExpressions.Translations.MemberAccessTranslation.For(MemberExpression memberAccess, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.GetParameterTranslation(Expression parameter, IParameter info, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.<>c__DisplayClass7_0.<.ctor>b__0(Expression p, Int32 index)
at AgileObjects.ReadableExpressions.Extensions.InternalEnumerableExtensions.d__7`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation..ctor(IMethodBase method, IEnumerable`1 parameters, Boolean showParameterTypeNames, Int32 count, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.For[TParameterExpression](IMethodBase method, ICollection`1 parameters, Boolean showParameterTypeNames, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.For[TParameterExpression](IMethod method, ICollection`1 parameters, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.NewingTranslationBase..ctor(NewExpression newing, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.AnonymousTypeNewingTranslation..ctor(NewExpression newing, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.NewingTranslation.For(NewExpression newing, ITranslationContext context, Boolean omitParenthesesIfParameterless)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
at AgileObjects.ReadableExpressions.Extensions.PublicTranslationContextExtensions.GetCodeBlockTranslationFor(ITranslationContext context, Expression expression)
at AgileObjects.ReadableExpressions.Translations.LambdaTranslation..ctor(LambdaExpression lambda, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
at AgileObjects.ReadableExpressions.Extensions.PublicTranslationContextExtensions.GetCodeBlockTranslationFor(ITranslationContext context, Expression expression)
at AgileObjects.ReadableExpressions.Translations.QuotedLambdaTranslation.For(UnaryExpression quotedLambda, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.GetParameterTranslation(Expression parameter, IParameter info, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.<>c__DisplayClass7_0.<.ctor>b__0(Expression p, Int32 index)
at AgileObjects.ReadableExpressions.Extensions.InternalEnumerableExtensions.d__7`2.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation..ctor(IMethodBase method, IEnumerable`1 parameters, Boolean showParameterTypeNames, Int32 count, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.For[TParameterExpression](IMethodBase method, ICollection`1 parameters, Boolean showParameterTypeNames, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ParameterSetTranslation.For[TParameterExpression](IMethod method, ICollection`1 parameters, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.MethodCallTranslation.For(MethodCallExpression methodCall, ITranslationContext context)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetDefaultTranslation(Expression expression)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslationFor(Expression expression)
at AgileObjects.ReadableExpressions.Translations.ExpressionTranslation.GetTranslation()
at AgileObjects.ReadableExpressions.ExpressionExtensions.ToReadableString(Expression expression, Func`2 configuration)
at AgileObjects.ReadableExpressions.Visualizers.ObjectSource.ExpressionVisualizerObjectSource.GetTranslationFor(Object target)
at AgileObjects.ReadableExpressions.Visualizers.ObjectSource.ExpressionVisualizerObjectSource.GetData(Object target, Stream outgoingData, Action`2 serializer)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions