Создать универсальное выражение из имени свойства строки

У меня есть переменная с именем sortColumn, которая содержит текст столбца, по которому я хочу отсортировать результат запроса. У меня также есть общий репозиторий, который принимает в качестве параметра выражение, которое содержит поле, по которому я хочу отсортировать. Я не могу получить от имени свойства строки до выражения.

Таким образом, общий репозиторий, который у меня есть, содержит следующий метод

public IEnumerable<TEntity> Get<TOrderBy>(Expression<Func<TEntity, bool>> criteria,
                                          Expression<Func<TEntity, TOrderBy>> orderBy, int pageIndex,
                                          int pageSize,
                                          bool isAssendingOrder = true,
                                          EnumDeletePolicy deletePolicy = EnumDeletePolicy.ExcludeDeleted)

Обратите внимание, что вторым параметром для этого Get является Expression-Func-TEntity, TOrderBy. Как я уже упоминал, у меня есть переменная sortColumn, которая содержит строку для свойства моего объекта TEntity. Мне нужно преобразовать эту строку в выражение, которое я могу передать в метод Get.

Вот что у меня сейчас.

        var parameter = Expression.Parameter(typeof(IContract));
        var memberExpression = Expression.Property(parameter, data.SortColumn);
        var lambdaExpression = Expression.Lambda(memberExpression, parameter);

Который создает объект типа LambdaExpression. Фактическим типом этого LambdaExpression является Expression-Func-IContract, строка (или любой другой тип sortColumn свойства). Если я вызову метод Get, передам это LambdaExpression и явно приведу его к типу Expression, тогда он будет работать нормально. Проблема в том, что я не знаю, что такое тип выражения, это может быть строка, int, int? И т. Д. Все зависит от типа свойства, определенного в свойстве sortColumn.

Можете ли вы помочь мне сделать последний прыжок на правильный тип выражения?

Редактировать, основываясь на предложениях Марка: у меня почти есть эта работа, фактически основанная именно на вопросе, который она работает, но у меня осталась одна проблема.

IContract, который является Типом сущности, к которому я обращаюсь, на самом деле наследуется от IRelationship. Если я указываю поле из интерфейса IContract, то приведенный выше код работает. Если я укажу поле из интерфейса IRelationship, следующая строка завершится неудачно.

        var memberExpression = Expression.Property(parameter, data.SortColumn);

Если я попробую что-то вроде ниже, так что я получаю выражение MemberExpression из IRelationship, но собираю лямбду на основе IContract, я получаю сообщение об ошибке из репозитория.

        var parameter = Expression.Parameter(typeof(IRelationship));
        var memberExpression = Expression.Property(parameter, data.SortColumn);
        var orderBy = Expression.Lambda(memberExpression, Expression.Parameter(typeof(IContract)));

Я получаю сообщение об ошибке: «Параметр» не был связан в указанном выражении запроса LINQ to Entities ».

Последнее выражение, чтобы заставить его работать, было это

        var parameter = Expression.Parameter(typeof(IContract));
        var memberExpression = Expression.Property(parameter, typeof(IRelationship), data.SortColumn);
        var orderBy = Expression.Lambda(memberExpression, parameter);

Поэтому мне нужно было указать средний параметр в строке memberExpression, чтобы сказать, посмотрите в унаследованном интерфейсе Relationship для свойства

Ответы на вопрос(1)

Ваш ответ на вопрос