使用数据服务的性能

本文关键字:性能 服务 数据 | 更新日期: 2023-09-27 18:34:22

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

我有一个数据服务类和方法 GetAll 从 DBF 文件加载数据。所有数据都显示在数据网格中。文件的路径由 OpenFileDialog 选择。当我转到另一个视图时,我只需要该数据的一个小和平(一列(。现在我想知道如何在另一个视图中获取这些数据模型:

  1. 通过具有文件路径的 Messenger 字符串发送到第二个视图模型并按服务读取数据(再次使用发送路径连接到文件(此方法通过 Messenger 发送较小的对象,但应用程序需要再次连接到文件或
  2. 在第一个视图模型准备字符串集合(来自 DBF 的列(并通过 Messenger 发送此集合。

我也想知道如何多次获取数据。如果我有 GetAll 方法,我有包含所有数据的对象。我可以有这样的东西吗?

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

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

但是在某些项目中,我看到每个方法都与数据库相连。最佳实践是什么?

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

使用数据服务的性能

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

此外,如果将数据加载一次(到 RAM 中(,则当数据更改时,数据网格将显示无效数据。

最佳做法可能是编写多个数据服务函数,例如:

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 表达式轻松查询上下文数据:

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