c# - MVVM:加载大数据记录

标签 c# wpf mvvm observablecollection

正如我从 MVVM 模式中了解到的那样,每个 ViewModel 中都有一个 ObservableCollection,它保存所有模型。我有一个像这样实现的 ViewModel:

    public class ViewModel {

        public void LoadData() {
            Items = new ObservableCollection(_logic.Select());
            IsDataLoaded = true;
        }
    }

比方说_logic.Select()返回 List<>表中的所有记录。现在数据量很大怎么办?如果表中有数千甚至数十万条记录怎么办?我应该将它们全部加载到 ObservableCollection 中吗? ?加载它们需要很长时间。

最佳答案

您不应加载数据库中的所有数据,而应仅加载您需要的数据。 想想如果您只需要一个注册表,加载 1000 个注册表会对您的性能造成多么严重的影响:

您需要查询数据库。使用服务器创建并执行查询并将所有数据保存在某处(通常在内存中)。 然后发送给客户。 客户端还需要将数据保存在某处。

如前所述,您可以使用服务器端分页和/或过滤。

逻辑很简单,在您的服务器上您可能有一个“return MyEntity;”或类似的方法。

与其这样做,为什么不实现 Linq 提供的“Take”扩展方法。

编辑:

找到这个例子: http://blogs.msdn.com/b/brada/archive/2009/07/17/business-apps-example-for-silverlight-3-rtm-and-net-ria-services-july-update-part-8-wcf-based-data-source.aspx

该文章涵盖的内容不仅仅是分页,但要特别注意:

public IEnumerable<SuperEmployee> GetSuperEmployees(int page)
{
    using (var context = new NORTHWNDEntities()) 
    {    
        var q = context.SuperEmployeeSet.OrderBy(emp=>emp.EmployeeID).Skip(page * PageSize).Take(PageSize);    
        return q.ToList(); 
   }
}

检查“q”的 qhe 值是否使用 Skip 和 Take 方法转到特定项目,并从那里获取 X 数量的项目。

最后,排序与上面的代码非常相似,但更复杂。您可以使用 Linq 中的Where 方法来实现它。

关于c# - MVVM:加载大数据记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23056278/

相关文章:

wpf - 为什么这个标签在绑定(bind)时看起来与静态值不同?

c# - 在 C# 中替换字符串中的 unicode 字符

c# - 为可观察集合实现中介设计模式

单击 WPF TreeView 项

c# - 如何使图像在 wpf 中的鼠标悬停事件中增长 x %?

wpf - 可用的 Prism 区域控件

xaml - MVVM INotifyPropertyChanged无法正常工作

mvvm - 如何将 Combobox 的选定项绑定(bind)到两个不同的属性?

c# - Microsoft 标准计算器中使用的变量类型

c# - 如何使用 Crystal Report Visual Studio 2013 在条形图中添加 2 个系列