如果您要搜索大量数据,使用数据库查询过滤数据可能会更快,因为数据库通常会很快完成搜索。
此外,如果您将数据加载一次(到 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);