我是MVVM Light的新手,我想知道如何使用Messenger和数据服务。
我有一个dataService类和方法GetAll从DBF文件加载数据。所有数据都显示在DataGrid中。 OpenFileDialog选择文件路径。当我进入另一个视图时,我只需要一个小数据的和平(一列)。现在我想知道如何在另一个viewModel中获取这些数据:
我也想知道如何多次获取数据。如果我有GetAll方法,我对所有数据都有对象。我能有这样的东西吗?:
class DataService : IDataService
{
List<T> _allData = new List<T>();
List<T> getAll()
{
...
_allData = ...
return _allData;
}
}
现在,如果我有其他方法,我可以使用集合_allData,并且每次需要一些数据时都不必连接do DB或file。
但在某些项目中,我发现每个方法都与DB有关。什么是最佳做法?
(对不起,如果我的问题很混乱;))
答案 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);