【问题标题】:MVVM: Loading large data recordsMVVM:加载大数据记录
【发布时间】:2014-05-28 04:30:26
【问题描述】:

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

    public class ViewModel {

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

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

【问题讨论】:

  • 有没有想过使用服务器端分页?
  • 其实我是新手。也许我应该了解服务器端分页。有什么好的资源吗?我要去google一下。

标签: c# wpf mvvm observablecollection


【解决方案1】:

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

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

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

逻辑很简单,在你的服务器上你可能有一个“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 and Take 方法转到特定项目,然后从那里获取 X 数量的项目。

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

【讨论】:

  • 如果我应该只加载我需要的数据,那么 ObservableCollection 有什么用?假设我有一个注册表,它一次只显示一个人的信息。你是说我根本不需要这个注册表单的任何 ObservableCollection?
  • Observable 集合基本上是一个实现了 INotifyPropertyChanged 接口的集合。它的作用不止于此,但基本上它反映了 UI 上集合本身的任何更改,而无需您编写太多代码。如果您只使用一个实体,那么表单应该具有该特定对象的一个​​实例,并且所有控件都绑定到它的属性。 @user3530012
  • 感谢您的示例。实际上我在数据库中有一千个实体,但在某个时间我只编辑其中一个,我不会显示实体列表。现在我需要知道在这种情况下我是否应该在 ViewModel 中有一个 ObservableCollection?
  • 在这种情况下,不要在表单的 ViewModel 上使用 ObservableCollection。取而代之的是,使用您实际使用的实体类型的属性。仅在同时需要多个实例的地方(网格、组合框等)使用集合。
猜你喜欢
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 2012-12-20
  • 2022-01-19
相关资源
最近更新 更多