Фильтровать строки в таблице с помощью ASP.NET динамические сущности данных
В настоящее время, ASP.NET динамические сущности данных поддерживают фильтрацию только по логическим или внешним ключевым связям out-of-box
Как реализовать пользовательский фильтр, основанный на выпадающем списке значений для фильтрации строк?
2 ответа:
Я сделал нечто подобное, просто добавив параметры where к источнику данных GridView. Предположим, что пользователь выбирает цветовой код 9 из выпадающего списка.На в, задайте параметр.
Parameter p = new Parameter { Name = "ColorSelection", Type = TypeCode.Int32, DefaultValue = "9" }; GridDataSource.WhereParameters.Add(p); GridDataSource.Where = "ColorId == @ColorSelection";
Я придумал способ сделать это так, чтобы это вписывалось в предполагаемую систему шаблонов, которая ASP.NET использование динамических данных
В основном проблема с этим заключается в том, что мы не знаем во время компиляции, что такое базовый столбец, который может быть отфильтрован, не говоря уже о том, какой это тип или имя столбца - первый ключ, который привел меня к пути реализации решения, состоял в том, что все элементы управления фильтра имеют метод GetQueryable
К сожалению, этот метод работает на примере
IQueryable
вместоIQueryable<T>
, что не позволяет нам просто использовать стандартные операторы LINQ. То, что нам нужно, - это способ динамического создания предиката (или даже цепочки предикатов - в этом случае, однако, все, что я хотел сделать, - это получить отдельные записи и отсортировать их), которые мы можем затем применить кIQueryable
К сожалению, нет готовой реализации динамического LINQ, поэтому мы должны использовать деревья выражений - второй подсказкой о том, как решить эту проблему, является тот факт, что
IQueryable
объект выставляет a .Коллекция выраженийЧто нам нужно сделать, так это создать дерево выражений для представления предиката (для выбора distinct в этом случае), затем присоединить его к
IQueryable
и вернуть его. Это, конечно, не было очевидной, ни прямолинейной задачей, и я, конечно, не находил деревья выражения легкими для понимания, но в этом было то, как я решил проблему.