MVVM:加载大型数据记录

时间:2014-04-14 09:15:32

标签: 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中加载它们吗?它们需要花费大量时间才能加载。

1 个答案:

答案 0 :(得分:3)

您不应该从数据库加载所有数据,只加载您需要的数据。 想想如果你只需要一个注册表,加载1000个注册表会对你的表现造成多大的损害:

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

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

逻辑很简单,在你的服务器上你可能有一个&#34;返回MyEntity;&#34;或类似的方法。

为什么不实施&#34; Take&#34;而不是这样做呢? Linq提供的扩展方法。

编辑:

找到这个例子: 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(); 
   }
}

检查&#34; q&#34;的值使用Skip and Take方法转到特定项目,然后从中获取X个数量。

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