Я выяснил, как сделать предикат из строки, предоставленной клиентом на основе Dynamic Linq (это обернуто в объект Спецификации):
return System.Linq.Dynamic.DynamicExpression.ParseLambda<TE, bool>
(filter.ToString(), arguments.ToArray())
где фильтр - это строка языка выражений, как описано в их файле справки. Работает как шарм.
Однако можно ли перевести строковый список полей orderby в строго типизированное выражение, например:
Expression<Func<E, object>> orderby
Примечания:
Вот мой метод хранилища для фильтрации и заказа элементов
public IList<E> Get(Expression<Func<E, bool>> filterLambda = null,
Expression<Func<E, object>> orderbyLambda = null,
int? page = null,
int? pageSize = null)
Я хотел бы позвонить, используя:
var a = Repo.Get( filterLambda: Specification.Where( StringListOfFilters),
orderbyLambda: Specification.OrderBy( StringListOfOrderBy),
page: 1,
pageSize: 100 );
Есть идеи, как преобразовать строковый список полей OrderBy в строго типизированное лямбда-выражение? Примеры строк:
fieldname
fieldname descending
Другое примечание:
Я перевожу строки, поступающие от клиента, которые fieldname op value
проверяют их с помощью Regex, чтобы предотвратить инъекцию. Кроме того, я ссылаюсь только на Dynamic Linq в объекте спецификации, а не на репозиторий.