【问题标题】:Displaying a large collection in a DataGrid在 DataGrid 中显示大型集合
【发布时间】:2010-08-09 09:58:40
【问题描述】:

收集的项目数量:~100k 列显示的字段数量:4-10

问题本身 - 集合是从使用 EntityFramework 的数据库中获取的。在开发计算机上加载和具体化所有所需数据大约需要 10-12 秒。出现的另一件事是同一个集合可以绑定到多个控件,因此,它们必须单独过滤(= 不设置默认集合视图过滤器)。目前,我将绑定设置如下:

Binding b = new Binding();
b.Source = new CollectionViewSource() { Source = MyLargeCollection }.View;
MyDataGrid.SetBinding(DataGrid.ItemsSourceProperty, b);

创建一个新的 CollectionViewSource 大大增加了初始化所需的时间 - 几分钟(我怀疑它出于某种原因枚举了 100k 集合)。我的意思是,如果我只是设置:

b.Source = MyLargeCollection;

只需 10-12 秒即可从数据库加载和具体化数据。

问题 - 我的代码有问题吗?如果不是 - 将同一个大型集合绑定到不同项目控件但具有不同集合视图的正确方法是什么?

【问题讨论】:

    标签: wpf data-binding filter large-data-volumes


    【解决方案1】:

    只需使用 Linq to Entities 加载具有指定过滤器的实体,以确保您不会加载所有 10k 条记录,因为没有用户对具有 10k 条记录的网格感兴趣。

    查询绑定示例:

    grid1.DataContext = (from i in context.MyItems
                        where i.MyPropertyToFilter == "myFilter"
                        select i).ToList();
    
    grid2.DataContext = (from i in context.MyItems
                        where i.MyOtherPropertyToFilter == "myOhterFilter"
                        select i).ToList();
    

    这样您只加载控件所需的记录

    【讨论】:

    • 好吧,这只能部分解决问题。我知道这是对结果集进行过滤和排序的一种巧妙方法。考虑一种情况,当您需要在一个控件中包含 100k 条目(== 或为用户创建“感觉”,即那里有 100k 条目)。优化它的最佳方法是什么?首先想到 - 只需查询所需的数据 => 数据虚拟化。然而,这会在底层集合中引发诸如 IndexOf 等方法的问题。
    • 如果您需要这样的功能,您将需要实现一个自己的类,该类包装您尚未初始化的完整集合并创建 Count、IndexOf、Indexer 的自定义实现......一个好的建议是实现 IList。希望对你有帮助
    • 好吧,我最终查询了部分数据,这些数据没有被实体框架具体化和跟踪。同时我使用 SelectedValuePath=Id 通过 id 选择实体。这样内存消耗是最小的。对于一组 100k 个实体,在我的机器上加载此类集合的时间从 0.2 到 0.5 秒不等。两个 nvarchar(255) 列的内存消耗约为 20-30 mb。这只是我的情况,不是基准。
    • 实现 IList 是一种选择,但是当您进行部分选择(使用一些 WHERE 参数)时,您仍然会遇到 IndexOf 问题,因为它至少需要对数据库进行一次查询,而 EF 实际上并不支持在结果集中选择行号。不过感谢您的回答。它让我走了。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2012-01-20
    相关资源
    最近更新 更多