Фильтровать строки в таблице с помощью ASP.NET динамические сущности данных


В настоящее время, ASP.NET динамические сущности данных поддерживают фильтрацию только по логическим или внешним ключевым связям out-of-box

Как реализовать пользовательский фильтр, основанный на выпадающем списке значений для фильтрации строк?

2 4

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 и вернуть его. Это, конечно, не было очевидной, ни прямолинейной задачей, и я, конечно, не находил деревья выражения легкими для понимания, но в этом было то, как я решил проблему.