Wpf 在数据网格中显示大型集合

Wpf 在数据网格中显示大型集合,wpf,data-binding,filter,large-data-volumes,Wpf,Data Binding,Filter,Large Data Volumes,收藏中的物品数量:~10万件 列中显示的字段数量:4-10 问题本身-集合是使用EntityFramework从数据库中获取的。在dev计算机上加载和具体化所有所需的数据大约需要10-12秒。还有一件事是,同一个集合可以绑定到多个控件,因此,它们必须单独过滤(=不设置默认集合视图过滤器)。目前,我将绑定设置如下: Binding b = new Binding(); b.Source = new CollectionViewSource() { Source = MyLargeCollectio

收藏中的物品数量:~10万件 列中显示的字段数量:4-10

问题本身-集合是使用EntityFramework从数据库中获取的。在dev计算机上加载和具体化所有所需的数据大约需要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秒


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

只需使用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的条目)。优化它的最佳方法是什么?第一个想法-只需查询所需的数据=>data virtualization。但是,这会给基础集合中的IndexOf等方法带来问题。如果您需要此类功能,则需要实现自己的类来包装尚未初始化的完整集合,并创建Count、IndexOf、Indexer等的自定义实现。。。一个好的建议是实施IList。希望这对您有所帮助。好吧,我最终查询的部分数据并没有被实体框架具体化和跟踪。同时,我使用SelectedValuePath=Id按Id选择实体。这样内存消耗最小。在我的计算机上加载这样一个集合的时间在0.2秒到0.5秒之间,对于一组100k实体。两个nvarchar(255)列的内存消耗约为20-30 mb。这只是我的情况,不是一个基准测试。实现IList是一个选项,但是当您执行部分选择(使用一些WHERE参数)时,IndexOf仍然存在问题,因为它至少需要对数据库进行一次查询,而EF实际上不支持在结果集中选择行号。谢谢你的回答。这让我走了