Создать универсальное выражение из имени свойства строки
У меня есть переменная с именем 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 для свойства