Как сделать ObjectResult фильтруемым

#wpf #c#-4.0 #entity-framework-4

#wpf #c #-4.0 #entity-framework-4

Вопрос:

Кажется, что это должно быть просто, но я, по-видимому, слишком туп, чтобы понять это. Я получаю ObjectResult с помощью простого ObjectQuery ; это всего лишь несколько записей в таблице данных. Я присваиваю его CollectionViewSource свойству источника. Затем я смотрю на свойство View CollectionView и вижу, что CanFilter и CanSor t оба являются ложными. Когда я получаю DefaultView как BindingListCollectionView, он показывает, что значение CanCustomFilter равно false . Поскольку они доступны только для чтения, я не могу изменить значение (значения). Теперь я хотел бы установить фильтр (или сортировку) для полученных данных, не возвращаясь к SQL Server, но, хоть убейте, я не могу найти способ получить данные с этими свойствами, установленными true.

Я попытался использовать ObjectResult.AsQueryable<T>() , и результат ИМЕЕТ CanFilter значение и CanSort true, но это меняет тип представления с System.Windows.Data.BindingListCollectionView into MS.Internal.Data.EnumerableCollectionView , и я не могу найти способ вернуть его EnumerableCollectionView обратно в a BindingListCollectionView .

Любые указатели были бы весьма признательны.

Комментарии:

1. Вы не можете фильтровать или сортировать ObjectResult . Это невозможно, потому ObjectResult что может быть прочитано только один раз, поэтому, если вы визуализируете его в первый раз, результат считывается, и любая другая операция, связанная с его повторным чтением, завершится неудачей.

Ответ №1:

Я думаю, что основная причина такого отклонения заключается в том, что BindingListCollectionView невозможно отфильтровать или отсортировать какие-либо IQueryable объекты (не знаю почему), несмотря на выполнение запроса при настройке Source property . Самый простой способ — использовать ToList<T>() метод, который выполняет запрос, но сформированный List<T> может быть отсортирован и отфильтрован с помощью BindingListCollectionView

Комментарии:

1. Спасибо, Аспирин, это действительно работает. Однако, как только источник привязан к результатам ToList<T>() , теперь это ListCollectionView, а не BindingListCollectionView, поэтому необходимо использовать соответствующий подход к фильтрации, т.Е. Установить представление. Filter = новый предикат<объект>(), и пользовательский фильтр с его синтаксисом не может быть использован. Итак, хотя это обходной путь, он не отвечает на мой вопрос. Кстати, в другом элементе управления (они находятся в полях со списком) я использовал StyleSelector для выполнения фильтрации — еще один обходной путь, но не то, что я хотел бы сделать.

2. почему вы устанавливаете в фильтр пустой предикат? PS ListCollectionView реализует те же интерфейсы, что и BindingListCollectionView и IEditableCollectionViewAddNewItem

3. Я не использую пустой предикат фильтра; Я просто указывал, что я должен использовать эту форму фильтра (синтаксис). Фактическая запись — viewType . Фильтр = новый предикат<объект>(фильтр. FilterSubmittalType);