Фильтрация строк в таблице с использованием динамических объектов данных ASP.NET - PullRequest
4 голосов
/ 22 июля 2011

В настоящее время ASP.NET Dynamic Data Entities поддерживает фильтрацию только по логическим отношениям или отношениям внешнего ключа из коробки

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

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

Я нашел способ сделать это, чтобы он соответствовал предполагаемой системе шаблонов, которую использует ASP.NET Dynamic Data

В основном проблема заключается в том, что во время компиляции мы не знаем, по какому базовому столбцу можно фильтровать, не говоря уже о том, какой это тип или имя столбца, - первый ключ, который привел меня к пути реализации Решением было то, что все элементы управления Filter имеют метод GetQueryable

К сожалению, этот метод работает на экземпляре IQueryable, а не IQueryable<T>, поэтому мы не можем просто использовать стандартные операторы LINQ. Нам нужен способ динамического создания предиката (или даже цепочки предикатов - в этом случае, однако, все, что я хотел сделать, это получить отдельные записи и отсортировать их), который мы затем можем применить к IQueryable

К сожалению, нет встроенной реализации Dynamic LINQ, поэтому мы должны использовать деревья выражений - вторым намеком на решение этой проблемы является тот факт, что объект IQueryable предоставляет коллекцию .Expressions

Нам нужно создать дерево выражений для представления предиката (для выбора отличных в этом случае), затем присоединить его к IQueryable и вернуть его. Это, конечно, не было ни очевидной, ни простой задачей, и я определенно не нашел, что деревья выражений легко понять, но в этом и заключался способ решения проблемы.

0 голосов
/ 26 июля 2011

Я сделал что-то подобное, просто добавив параметры where в источник данных GridView. Предположим, ваш пользователь выбирает Color Code 9 из выпадающего меню. На Page_Init установите параметр.

Parameter p = new Parameter { Name = "ColorSelection", Type = TypeCode.Int32, DefaultValue = "9" };
GridDataSource.WhereParameters.Add(p);
GridDataSource.Where = "ColorId == @ColorSelection";
...