-
Notifications
You must be signed in to change notification settings - Fork 23
Open
Description
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
Labels
No labels