2009-02-02 47 views
1

我在多個論壇上提出過這個問題,似乎沒有人會想要採取這樣的措施。從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圖層和應用程序圖層綁定。也很慢,因爲你需要多次訪問數據庫...

有沒有人有解決這個問題?

謝謝, 埃裏克。

回答

1

我認爲模型視圖視圖模型模式(MVVM)將幫助你在這裏。 爲您的第一個列表框創建一個視圖,並確保它將其集合公開爲實現INotifyCollectionChanged的東西。與您的第二個和第三個列表框相同。 你也可以讓它們中的任何一個包含綁定到你的文本框進行過濾的屬性。當值更改時,您可以簡單地調整列表綁定到的內存集合。

有一個谷歌MVVM,因爲它工作得很好。大多數例子都與WPF有關,但仍然適用於你正在做的事情。

還檢查了CodePlex上的一款名爲「可綁定的LINQ」,它允許你做這樣的事情:

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