使用DataService的性能

时间:2013-10-08 17:05:10

标签: c# wpf mvvm mvvm-light dataservice

我是MVVM Light的新手,我想知道如何使用Messenger和数据服务。

我有一个dataService类和方法GetAll从DBF文件加载数据。所有数据都显示在DataGrid中。 OpenFileDialog选择文件路径。当我进入另一个视图时,我只需要一个小数据的和平(一列)。现在我想知道如何在另一个viewModel中获取这些数据:

  1. 通过带有文件路径的Messenger字符串发送到第二个viewModel并按服务读取数据(再次使用发送路径连接到文件)此方法通过Messenger发送较小的对象,但应用程序需要再次连接到文件或
  2. 在第一个viewModel上准备字符串集合(DBF中的列)并通过Messenger发送此集合。
  3. 我也想知道如何多次获取数据。如果我有GetAll方法,我对所有数据都有对象。我能有这样的东西吗?:

    class DataService : IDataService
    {
       List<T> _allData = new List<T>();
    
       List<T> getAll()
       {
         ...
         _allData = ...
    
         return _allData;
       }
    }
    

    现在,如果我有其他方法,我可以使用集合_allData,并且每次需要一些数据时都不必连接do DB或file。

    但在某些项目中,我发现每个方法都与DB有关。什么是最佳做法?

    (对不起,如果我的问题很混乱;))

1 个答案:

答案 0 :(得分:0)

如果您要搜索大量数据,使用数据库查询过滤数据可能会更快,因为数据库通常可以非常快速地进行搜索。

此外,如果您将数据加载一次(到RAM中),当数据更改时,DataGrid会显示无效数据。

最佳做法可能是编写几个DataService函数,例如:

List<ColumnType> GetColumn(int column)
{
    var data = new List<ColumnType>();
    using (var connection = new MyConnection())
    {
         //load data
    }
    return data;
}

在每个功能中连接和断开数据库以获取项目。但肯定会将诸如GetSingle(ItemId)之类的函数放入循环中是错误的。

为了简单起见,我建议使用较少耦合的方法,避免类之间的许多链接或使用静态属性。因为通常它不会显着提高性能以保持数据并避免连接到数据库。但我无法确定,这取决于你的申请。


编辑:

如果您的Db文件非常小,您可以牺牲简单性能并加载所有数据并将其存储在RAM中。你也可以像这样使用标准的存储库:

public class Repository<TModel> where TModel: class
{
    public Repository<TModel>(Context context)
    {
        _context = context;
    }
    private Context _context;
    ...
    public IEnumerable<TModel> Find(Expression<Func<TModel, bool>> where)
    {
        return _context.CreateObjectSet<TModel>().Where(where);
    }
    public IEnumerable<TResult> GetColumn(Func<TSource, TResult> selector)
    {
        return _context.CreateObjectSet<TModel>().Select(selector);
    }

}

上下文是放置所有已加载数据的位置。它应该具有这样的通用函数:

public class Context
{
    private List<Customer> _customerList;
    private List<Product> _productList;
    public Context()
    {
        //Load All Lists here or in the following function instead
    }

    public List<TModel> CreateObjectSet<TModel>() where TModel : class
    {
        if (TModel is Customer) 
        {
            //you can load _customerList here instead of in constructor
            //check if _customerList is null then load it here for now and future use
            return _customerList;
        }
        if (TModel is Product)
        {
            //check if _productList is null then load it here for now and future use
            return _productList;
        }
        ...
        throw...
    }
}

现在您可以使用lambda表达式轻松查询您的Context数据:

var repository = new Repository<Product>(context);
List<string> nameColumn = repository.GetColumn(x => x.Name);