C# MVVM:加载大数据记录

C# MVVM:加载大数据记录,c#,wpf,mvvm,observablecollection,C#,Wpf,Mvvm,Observablecollection,正如我从MVVM模式中了解到的,每个ViewModel中都有一个ObservableCollection,它保存所有模型。我的ViewModel实现如下: public class ViewModel { public void LoadData() { Items = new ObservableCollection(_logic.Select()); IsDataLoaded = true; }

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

    public class ViewModel {

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

假设
\u logic.Select()
返回表中所有记录的
列表。如果数据很大呢?如果表中有数千条或十万条记录呢?我是否应该将它们全部加载到
可观察集合
?加载它们需要很多时间。

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

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

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

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

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

编辑:

找到以下示例:

这篇文章的内容不仅仅是传呼,但要特别注意:

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(); 
   }
}
public IEnumerable GetSuperEmployees(int页)
{
使用(var context=new NORTHWNDEntities())
{    
var q=context.SuperEmployeeSet.OrderBy(emp=>emp.EmployeeID).Skip(page*PageSize).Take(PageSize);
返回q.ToList();
}
}
检查“q”的qhe值是否使用Skip and Take方法转到特定项目,然后从该项目中取出X个数量


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

有没有想过使用服务器端分页?事实上,我对这方面还不熟悉。也许我应该学习服务器端分页。有什么好的资源吗?我要用谷歌搜索它。如果我只加载我需要的数据,那么ObservableCollection有什么用?假设我有一张登记表,一次只显示一个人的信息。你是说我根本不需要任何用于此注册表的ObservableCollection?ObservableCollection基本上是一个实现INotifyPropertyChanged接口的集合。它做的不止这些,但基本上它反映了UI上集合本身的任何更改,而不需要您编写大量代码。如果您只使用一个实体,那么表单应该具有该特定对象的实例以及绑定到其属性的所有控件@User3530012感谢您的示例。事实上,我在数据库中有一千个实体,但在某个特定时间,我只编辑其中一个,我不会显示实体列表。现在我需要知道,在这种情况下,ifI是否应该在ViewModel中具有ObservableCollection?在这种情况下,不要在窗体的ViewModel上使用ObservableCollection。相反,请使用实际使用的实体类型的属性。仅在同时需要多个实例的位置(网格、组合框等)使用集合。