2009-02-02 2 views
1

Я задал этот вопрос на более чем одном форуме, и, похоже, никто даже не захочет взять на него безумство.Коллекции от LINQ to SQL и способность фильтровать

Моя проблема проста, и я бы догадался, что каждый столкнулся с ней при использовании LINQ to SQL.

Если ваш есть объект LINQ под названием: Человек и вы хотели бы poulate окна списка, основываясь на всех человек, у вас есть в вашей БД задача проста:

BindingListCollectionView view; 
view = (BindingListCollectionView)CollectionViewSource.GetDefault (dataContext.Persons); 

Теперь говорит, что вы хотите для фильтрации результатов используйте текстовое поле над списком. что не будет работать, поскольку интерфейс IBindingList, реализованный объектами LINQ to SQL, возвращает false в свойстве CanFilter.

Что большинство людей делают, это создать ObservebleCollection, следующим примером является im sure, что большинство из вас используют.

ObservebleCollection<Person> col = new ObservebleCollection<Person>(dataContext.Persons.ToList()); 
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefault(col); 

Так как это будет возвращать ListCollectionView и не BindingListCollectionView будет filterbale и все хорошо с миром.

Здесь возникает проблема, что у вас есть Многопользовательская уровни внешний ключ отношений: Person < --- Псевдоним < --- Билеты

и теперь вы хотите иметь 3 окна списка привязываться при выборе лица во втором окне списка будет отображаться только его псевдоним, и когда будет выбран Alias, будет показан только его билет, это очень просто с привязкой и синхронизацией. проблема в том, что я хочу добавить фильтр текстовых полей на узлах всех списков (скажем, у человека более 1000 псевдонимов, и я хочу, чтобы их можно было фильтровать, чтобы выбрать 1).

Неприемлемое решение ObservebleCollection не будет работать, поскольку все возвращенные объекты Person будут иметь объекты EntitySet для отношения forgin, и это снова вернет noneBbindingListCollectionView none, а не ListCollectionView.

Единственный способ, которым я нашел это, - это вручную сбросить ObserverbleCollection на основе повторного запроса, это утомительная работа и заставляет меня связывать слой BusnessObjects и слой приложения. также очень медленно, так как вам нужно сделать много поездок в базу данных ...

У кого-нибудь есть решение?

Thanks, Eric.

ответ

1

Я думаю, модель Model View View-Model (MVVM) поможет вам здесь. Создайте представление для своего первого списка и убедитесь, что он предоставляет свою коллекцию как что-то, что реализует INotifyCollectionChanged. То же самое со вторым и третьим списками. Вы также можете сделать любое из них включать свойства для привязки к вашему текстовому полю для фильтрации. Когда значение изменяется, вы просто настраиваете коллекцию в памяти, к которой привязан список.

Имейте Google для MVVM, так как он работает достаточно хорошо. Большинство примеров будут относиться к WPF, но все еще применимы к тому, что вы делаете.

Также проверьте продукт на CodePlex под названием «Bindable Linq», которая позволяет делать такие вещи, как:

var q = from p in Persons.AsBindable() select p;