Я нашел способ сделать это, чтобы он соответствовал предполагаемой системе шаблонов, которую использует ASP.NET Dynamic Data
В основном проблема заключается в том, что во время компиляции мы не знаем, по какому базовому столбцу можно фильтровать, не говоря уже о том, какой это тип или имя столбца, - первый ключ, который привел меня к пути реализации Решением было то, что все элементы управления Filter имеют метод GetQueryable
К сожалению, этот метод работает на экземпляре IQueryable
, а не IQueryable<T>
, поэтому мы не можем просто использовать стандартные операторы LINQ. Нам нужен способ динамического создания предиката (или даже цепочки предикатов - в этом случае, однако, все, что я хотел сделать, это получить отдельные записи и отсортировать их), который мы затем можем применить к IQueryable
К сожалению, нет встроенной реализации Dynamic LINQ, поэтому мы должны использовать деревья выражений - вторым намеком на решение этой проблемы является тот факт, что объект IQueryable
предоставляет коллекцию .Expressions
Нам нужно создать дерево выражений для представления предиката (для выбора отличных в этом случае), затем присоединить его к IQueryable
и вернуть его. Это, конечно, не было ни очевидной, ни простой задачей, и я определенно не нашел, что деревья выражений легко понять, но в этом и заключался способ решения проблемы.