C# 如何避免使用MVVM模式对数据库进行冗余的二次查询?

C# 如何避免使用MVVM模式对数据库进行冗余的二次查询?,c#,database,data-binding,mvvm,C#,Database,Data Binding,Mvvm,如何在视图模型上使用MVVM模式避免对数据库的冗余二次查询: public class DataFormViewModel : INotifyPropertyChanged { private int companyId public int CompanyId { get { return companyId; } set { companyId = value; Ra

如何在视图模型上使用MVVM模式避免对数据库的冗余二次查询:

public class DataFormViewModel : INotifyPropertyChanged
{
    private int companyId
    public int CompanyId
    {
        get { return companyId; }
        set 
        { 
            companyId = value; 
            RaisePropentyChanged("FindingStatuses");
            RaisePropentyChanged("StatusCount");
        }
    }

    public List<FindingStatus> FindingStatuses
    {
        get 
        {
            return FindingStatusService.GetAvalableStatuses(CompanyId);
        }
    }

    public int StatusCount
    {
        get { return FindingStatuses.Count; }
    }
}
公共类DataFormViewModel:INotifyPropertyChanged
{
私人国际公司
公共国际公司
{
获取{return companyId;}
设置
{ 
公司ID=价值;
RaiseOpenTyChanged(“FindingStatus”);
RaisePropentyChanged(“状态计数”);
}
}
公共列表查找状态
{
得到
{
返回FindingStatusService.GetAvailableStatuses(CompanyId);
}
}
公共整数状态计数
{
获取{return FindingStatuses.Count;}
}
}

i、 e.当DataBinder更改了
CompanyId
时,将执行
FindingStatuses
,然后执行
StatusCount
,这将再次执行
FindingStatuses

首先,我不确定是否要将属性直接绑定到数据库操作。为什么不创建一个本地
列表
,表示“上次获取的”状态,然后显式刷新它


除此之外,属性访问通常被认为是相当便宜的——每次访问这些属性中的任何一个时调用数据库对我来说都是个坏主意。

就像Jon已经提到的那样,访问属性被认为是便宜的,你可以做上千次而不会产生任何副作用

我将缓存数据库访问的结果,并在以下任何请求中返回缓存的对象。即

private IList<FindingStatus> _findingStatuses;
public IList<FindingStatus> FindingStatuses
{
    get 
    {
        if (_findingStatuses == null) 
        {
             _findingStatuses = FindingStatusService.GetAvalableStatuses(CompanyId);
        }

        return _findingStatuses;
    }
}

避免对数据库进行多次(和无用)查询的最佳方法是在数据访问层中实现一个简单的缓存层

1-询问缓存是否已更新结果 2-查询数据库


下面是一个可以尝试的缓存类:

您可能希望返回一个
ReadOnlyCollection
而不是内部可变列表。这一点很好!根据您是否可以向该属性添加新状态,我可能会重命名该属性或将其作为方法公开。
public int CompanyId
{
    get { return companyId; }
    set 
    { 
        companyId = value;

        _findingStatuses = null;
        RaisePropentyChanged("FindingStatuses");

        RaisePropentyChanged("StatusCount");
    }
}