【问题标题】:Collections from LINQ to SQL and the ability to filter从 LINQ 到 SQL 的集合以及过滤能力
【发布时间】:2009-02-02 12:03:18
【问题描述】:

我在不止一个论坛上问过这个问题,似乎没有人愿意对此嗤之以鼻。

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

如果您有一个名为:Person 的 LINQ 对象,并且您想根据数据库中的所有人员填充一个列表框,那么任务很简单:

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 它将是过滤器,一切都很好。

问题来了,假设你有多层外键关系: 人物

and now you wish to have 3 list boxes binded when a person is selected the second list box will diplay only his Alias's and when an Alias is selected only it's Ticket's are shown, this is very simple with binding and syncronizing.问题是如果我想在所有列表框的 tob 上添加一个文本框过滤器(比如一个人有超过 1000 个别名,我希望能够过滤它们以选择 1)。

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

我发现解决此问题的唯一方法是根据返回的查询手动构建 ObserverbleCollection,这是一项繁琐的工作,并导致我将 BusnessObjects 层和应用程序层联系起来。它也很慢,因为您需要多次访问数据库...

有没有人可以解决这个问题?

谢谢, 埃里克。

【问题讨论】:

    标签: linq collections filtering


    【解决方案1】:

    我认为模型视图视图模型模式 (MVVM) 将在此为您提供帮助。 为您的第一个列表框创建一个视图,并确保它将其集合公开为实现 INotifyCollectionChanged 的​​东西。与您的第二个和第三个列表框相同。 您还可以使它们中的任何一个包含用于绑定到您的文本框以进行过滤的属性。当值发生变化时,您只需调整列表绑定到的内存中集合。

    有一个 MVVM 的谷歌,因为它工作得很好。大多数示例都与 WPF 有关,但仍然适用于您正在做的事情。

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      相关资源
      最近更新 更多