从LINQ到SQL的集合以及过滤的能力

时间:2009-02-02 12:03:18

标签: linq collections filtering

我在不止一个论坛上提出了这个问题,似乎没有人会想要嘲笑它。

我的问题很简单,我猜每个人在使用LINQ to SQL时都会遇到它。

如果您的LINQ对象名为:Person,并且您希望根据您在数据库中拥有的所有人来打包列表框,那么任务很简单:

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 它将是过滤器,一切都与世隔绝。

问题出现了,比如你有多级Forign关键关系: 人&LT; ---&别名LT; ---门票

现在你希望在选择一个人时绑定3个列表框,第二个列表框将仅显示他的别名,当选择别名时,只显示其票证,这对于绑定和同步来说非常简单。问题是,如果我想在所有列表框的tob上添加一个文本框过滤器(比如一个人有超过1000个别名,我希望能够过滤它们以选择1)。

ObservebleCollection的前一个解决方案将不起作用,因为返回的所有Person对象都将具有forgin关系的EntitySet对象,这将再次返回无过滤器BindingListCollectionView而不是ListCollectionView。

我发现这一点的唯一方法是根据重新生成的查询手动建立ObserverbleCollection,这是繁琐的工作,并使我将BusnessObjects图层与应用程序层绑定。也很慢,因为你需要多次前往数据库...

有没有人有解决方案?

谢谢,   埃里克。

1 个答案:

答案 0 :(得分:1)

我认为模型视图视图模型模式(MVVM)将在这里帮助您。 为您的第一个列表框创建一个视图,并确保它将其集合公开为实现INotifyCollectionChanged的内容。与第二个和第三个列表框相同。 您还可以将其中任何一个包含用于绑定到文本框以进行过滤的属性。当值更改时,您可以简单地调整列表绑定的内存中集合。

有一个谷歌MVVM,因为它运作良好。大多数示例都与WPF有关,但仍适用于您正在进行的操作。

还可以查看名为'Bindable Linq'的codeplex上的产品,它允许您执行以下操作:

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