我在多個論壇上提出過這個問題,似乎沒有人會想要採取這樣的措施。從LINQ到SQL的集合以及過濾能力
我的問題很簡單,我猜每個人在使用LINQ to SQL時都遇到過它。
如果您有稱爲LINQ對象:人,你想poulate基於所有你在你的數據庫擁有人的列表框中的任務很簡單:
BindingListCollectionView view;
view = (BindingListCollectionView)CollectionViewSource.GetDefault (dataContext.Persons);
現在說你想在列表上有一個文本框來過濾結果。那 將不起作用,因爲由LINQ to SQL對象實現的IBindingList接口在「CanFilter」屬性上返回false。
大多數人做的事情是創建一個ObservebleCollection,下面是一個例子 我相信大部分人都會使用它。
ObservebleCollection<Person> col = new ObservebleCollection<Person>(dataContext.Persons.ToList());
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefault(col);
因爲這將返回的ListCollectionView而不是BindingListCollectionView 這將是filterbale,一切都很好與世界同步。
這裏談到的問題,說你有Forign關鍵關係的多層次: 人< ---別名< ---門票
,現在你想擁有3個綁定列表框當選擇一個人第二個列表框將只顯示他的Alias,當選擇Alias時,只顯示Ticket's,這對綁定和同步非常簡單。問題是如果我想添加一個文本框過濾器的所有列表框(說一個人有超過1000個別名,我想能夠篩選他們選擇1)。
ObservebleCollection的先前解決方案將不起作用,因爲返回的所有Person對象都將具有forgin關係的EntitySet對象,並且這將再次返回一個none filterbale BindingListCollectionView而不是ListCollectionView。
我發現這種方法的唯一方法是基於重新調整的查詢手動創建一個ObserverbleCollection,這是非常繁瑣的工作,並導致我將BusnessObjects圖層和應用程序圖層綁定。也很慢,因爲你需要多次訪問數據庫...
有沒有人有解決這個問題?
謝謝, 埃裏克。