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

时间:2010-11-06 08:27:12

标签: c# database data-binding mvvm

如何在视图模型上使用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; }
    }
}

即。当DataBinder CompanyId更改FindingStatuses时,将执行StatusCount,然后执行FindingStatuses,这将再次执行{{1}}。

3 个答案:

答案 0 :(得分:2)

我不确定我是否首先将属性直接绑定到数据库操作。为什么不使用表示“上次获取”状态的本地List<FindingStatus>,然后明确刷新它?

除了其他任何东西,属性访问通常通常预计相当便宜 - 每次进行数据库调用你访问其中任何一个属性听起来是个坏主意我

答案 1 :(得分:0)

就像Jon已经提到的那样,访问属性预计会很便宜,你可以做一千次没有任何副作用。

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

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

        return _findingStatuses;
    }
}

然后你必须在提出通知之前清除你的缓存

public int CompanyId
{
    get { return companyId; }
    set 
    { 
        companyId = value;

        _findingStatuses = null;
        RaisePropentyChanged("FindingStatuses");

        RaisePropentyChanged("StatusCount");
    }
}

答案 2 :(得分:0)

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

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

您可以尝试以下缓存类:http://www.codeproject.com/KB/recipes/andregenericcache.aspx