Создать универсальное выражение из имени свойства строки
У меня есть переменная с именем sortColumn, которая содержит текст столбца, по которому я хочу отсортировать результат запроса. У меня также есть общий репозиторий, который принимает в качестве параметра выражение, которое содержит поле, по которому я хочу отсортировать. Я могу'Кажется, из имени свойства строки получается выражение.
Таким образом, общий репозиторий, который у меня есть, содержит следующий метод
public IEnumerable Get(Expression criteria,
Expression 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, тогда он будет работать нормально. Проблема в том, что я неНе знаю, что такое тип Expression, это может быть строка, int, int? и т. д. Все зависит от типа свойства, определенного в свойстве sortColumn.
Можете ли вы помочь мне сделать последний прыжок на правильный тип выражения?
Редактировать на основе Marc 's предложения: у меня почти есть эта работа, фактически основанная конкретно на вопросе, который она работает, но у меня есть 1 остающаяся проблема.
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 для свойства