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