Search code examples
c#asp.net-web-apiexpression-treeshotchocolate

Expression Property by string


I haven't worked with expressions that much, I am trying to reference an Expression property by string name but I cam getting this error:

c# The member expression must specify a property or method that is public and that belongs to the type Soly.Models.Profile (Parameter 'expression')

public class ProfileFilterType : FilterInputType<Profile> {
        protected override void Configure(
        IFilterInputTypeDescriptor<Profile> descriptor) {
            descriptor.BindFieldsExplicitly();

            descriptor.Field(f => Build<IFilterInputTypeDescriptor<Profile>, string>("firstName"));
        }

        public static Expression<Func<TClass, TProperty>> Build<TClass, TProperty>(string fieldName) {
            var param = Expression.Parameter(typeof(TClass));
            var field = Expression.PropertyOrField(param, fieldName);
            return Expression.Lambda<Func<TClass, TProperty>>(field, param);
        }
    }

descriptor.field signature:

IFilterFieldDescriptor Field<TField>(Expression<Func<T, TField>> propertyOrMember);

I am trying to iterate over the Profile properties with reflection and add a field descriptor for each in HotChocolate GraphQL.


Solution

  • Change descriptor.Field(f => Build<IFilterInputTypeDescriptor<Profile>, string>("firstName")); to:

    descriptor.Field(Build<Profile, string>("firstName"));
    

    Otherwise your are creating an expression with following type Expression<Func<Profile, Expression<Func<IFilterInputTypeDescriptor<Profile>,string>>>> which is definitely not what is expected.

    P.S.

    Not sure, but should not something like descriptor.Field("firstName"); or descriptor.Field(p => p.firstName); just work without need to manually handle expression trees?