开发者

How to avoid redundant second query to database with using MVVM pattern?

开发者 https://www.devze.com 2023-01-24 06:32 出处:网络
How to avoid redundant second query to database with using MVVM pattern on view model: public class DataFormViewModel : INotifyPropertyChanged

How to avoid redundant second query to database with using MVVM pattern on view model:

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 
        {
            ret开发者_如何学编程urn FindingStatusService.GetAvalableStatuses(CompanyId);
        }
    }

    public int StatusCount
    {
        get { return FindingStatuses.Count; }
    }
}

i.e. when CompanyId was changed by DataBinder FindingStatuses will be executed and then StatusCount will be executed, that will execute FindingStatuses again.


I'm not sure I'd bind the property directly to a database operation in the first place. Why not have a local List<FindingStatus> representing the "last fetched" statuses, and then explicitly refresh it?

Apart from anything else, property access is usually expected to be reasonably cheap - making a database call every time you access either of those properties sounds like a bad idea to me.


Like Jon already mentioned, accessing properties are expected to be cheap, something you can do a thousand times without any sideeffect.

I would cache the result of your database access and return the cached object on any following request. Ie

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

        return _findingStatuses;
    }
}

And then you would of course have to clear your cache before raising the notification

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

        _findingStatuses = null;
        RaisePropentyChanged("FindingStatuses");

        RaisePropentyChanged("StatusCount");
    }
}


The best way to avoid multiple (and useless) queries to the database, is implement a simple cache layer in the Data Access Layer.

1- Ask the cache if he already has an updated result 2- Else query the database

Here is a cache class you can try: http://www.codeproject.com/KB/recipes/andregenericcache.aspx

0

精彩评论

暂无评论...
验证码 换一张
取 消